将 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);
在这里您可以使用Base64
将Byte 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