将 InputStream 转换为 base64 字符串

Posted

技术标签:

【中文标题】将 InputStream 转换为 base64 字符串【英文标题】:Convert InputStream to base64 string 【发布时间】:2017-07-28 19:41:52 【问题描述】:

有一种方法可以将InputStream 转换为String,并将其编码为base64,对吗?

在我的函数中,我得到了InputStream 参数,需要将它插入到我的Oracle 数据库表中的BLOB 字段中。

有没有办法做到这一点?

(我的数据库对象包含用于保存图像的字符串字段,但我没有找到任何方法将 InputStream 转换为 base 64 格式的字符串。)

【问题讨论】:

您尝试过什么吗?如果您的 InputStream 包含图像数据,请不要使用String,但请使用byte[] 好的,这是什么意思?我需要将此字段更改为 Byte[]?以及如何将其从 inputStream 转换为 Byte[]?谢谢! 【参考方案1】:

您可以使用 Base64 API 尝试类似的操作。

InputStream finput = new FileInputStream(file);
byte[] imageBytes = new byte[(int)file.length()];
finput.read(imageBytes, 0, imageBytes.length);
finput.close();
String imageStr = Base64.encodeBase64String(imageBytes);

使用这个:

http://commons.apache.org/proper/commons-codec/archives/1.9/apidocs/org/apache/commons/codec/binary/Base64.html

【讨论】:

new FileInputStream 需要获取文件 - 我没有文件名....我需要设置 inputStream.... 只要你有 InputStream 应该没问题。你使用提到的逻辑 Base64.DEFAULT - 得到编译错误 - DEFAULT 不是字段。我需要做什么?【参考方案2】:

有一个很好的方法是使用IOUtils 将 InputStream 转换为Byte Array...

类似

    InputStream is;
    byte[] bytes = IOUtils.toByteArray(is);

在这里您可以使用Base64Byte Array 转换为String

示例代码

    String encoded = Base64.getEncoder().encodeToString(bytes);

现在您可以使用您的String

【讨论】:

IOUtils 未找到,请参阅此***.com/questions/24578243/…【参考方案3】:

最简单的方法是使用 apache-commons 中的 IOUtils 来做到这一点:

String result= IOUtils.toString(inputStream, ENCODING); 

来自文档:

toString(byte[] 输入,字符串编码) 使用指定的字符编码将 byte[] 的内容作为 String 获取。

之后在 Base64 中编码/解码:

// Encode 
String resultBase64Encoded = Base64.getEncoder().encodeToString(result.getBytes("utf-8"));


// Decode
byte[] asBytes = Base64.getDecoder().decode(resultBase64Encoded);
String resultAsStringAgain= String(asBytes, "utf-8")

注意:我假设您使用 JDK 8 进行编码/解码部分。

显然,OP 只想将 InputStream 持久化到数据库中。您可以使用 JDBC 直接执行此操作:

InputStream inputStream = ......;
String sql = "INSERT INTO TABLE_NAME(COLUMN_NAME) values (?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setBlob(1, inputStream);
statement.executeUpdate();

【讨论】:

@f1sh 我知道,但这是 OP 要求的。 那我该怎么办?在将图像数据插入 DB blob 之前,我应该将图像数据放在哪里? @foo 如果您只想将 InputStream 保存到数据库中,您可以直接执行此操作,而无需将其转换为其他任何内容... @foo 看到我关于如何将 InputStream 作为 Blob 直接保存到数据库的更新答案 要知道这是一种更节省内存的方法,接受的答案中的 byte[] 会吃掉它。您不需要临时空间来持久化流。【参考方案4】:

正如我所提到的,您不应该将String 用于二进制数据。不过,base64 编码的数据可以存储为字符串。但由于您的数据库列是一个 blob,我将继续使用 byte[]

使用 IOUtils 从InputStream 获取byte[]

byte[] bytes = IOUtils.toByteArray(yourInputStream);
byte[] encoded = java.util.Base64.getEncoder().encode(bytes);

然后将其写入数据库。使用 jdbc 和 PreparedStatement 编写 blob 如下所示:

yourPreparedStatement.setBytes(nIndex, encoded);

【讨论】:

我需要添加哪个导入?

以上是关于将 InputStream 转换为 base64 字符串的主要内容,如果未能解决你的问题,请参考以下文章

使用contentResolver将docx转换为Base64会在Android上提供不可读的格式

Jav文件压缩-InputStream转化为base64-Base64解码并生成图片

java将base64转换成图片并保存在指定路径下ImageIO.write(bi1,"png",w2)提示image==null

如何将 blob 图像转换为 base64? base64 变量显示为空

java 后台将base64字符串保存为图片

PHP将Base64图片转换为本地图片并保存