有一种方法可以将inputStream转换为String,并将其编码为base64,对吧? 在我的函数中,我得到了InputStream param,需要将它插入到我的Oracle数据库表的BLOB字段中。有没有办法做到这一点? (我的数据库对象包含保存图像的字符串字段,但我找不到任何方法将inputStream转换为base64格式的字符串) 谢谢!
答案 0 :(得分:13)
您可以使用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);
使用此:
答案 1 :(得分:6)
有一种很好的方法可以使用IOUtils
将InputStream转换为Byte Array
...
类似
InputStream is;
byte[] bytes = IOUtils.toByteArray(is);
您可以使用Base64
将Byte Array
转换为String
。
示例代码
String encoded = Base64.getEncoder().encodeToString(bytes);
现在您可以使用String
。
答案 2 :(得分:1)
最简单的方法是使用apache-commons中的IOUtils来做到这一点:
String result= IOUtils.toString(inputStream, ENCODING);
来自文档:
toString(byte []输入,字符串编码) 使用指定的字符编码以字符串形式获取byte []的内容。
之后在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保存到DB。您可以使用JDBC直接执行此操作:
InputStream inputStream = ......;
String sql = "INSERT INTO TABLE_NAME(COLUMN_NAME) values (?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setBlob(1, inputStream);
statement.executeUpdate();
答案 3 :(得分:1)
正如我所提到的,你不应该将String
用于二进制数据。 base64编码的数据可以存储为String。但由于您的数据库列是blob,我将继续使用byte[]
。
使用IOUtils从byte[]
获取InputStream
:
byte[] bytes = IOUtils.toByteArray(yourInputStream);
byte[] encoded = java.util.Base64.getEncoder().encode(bytes);
然后将其写入数据库。使用jdbc和PreparedStatement编写blob如下所示:
yourPreparedStatement.setBytes(nIndex, encoded);