2017-03-08 261 views
2

有一种方法可以将inputStream转换为String,并将其编码为base64? 在我的函数我得到InputStream参数,并需要将其插入到我的DB-oracle BLOB字段有一种方法来做到这一点? (我的对象包含字符串字段来保存图像里面,但我没有找到任何方式将inputStream转换为以base64格式的字符串) 谢谢!java将inputStream转换为base64字符串

+0

你尝试过什么吗?如果您的InputStream包含图像数据,请不要使用“String”,而应使用“byte []''。 – f1sh

+0

好的,这是什么意思?我需要将此字段更改为字节[]?以及如何将它从inputStream转换为Byte []?谢谢! – foo

回答

5

你可以使用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

+0

新的FileInputStream需要获取文件 - 我没有文件名....我需要设置inputStream .... – foo

+0

,只要您有InputStream,就应该可以。你使用提到的逻辑 – mhasan

+0

Base64.DEFAULT - 得到编译错误 - DEFAULT不是字段。我需要做什么? – foo

1

最简单的方法是使用IOUtils从Apache的公地做到这一点:

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

从文档:

的toString(字节[]输入,字符串编码) 获取一个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保存到数据库中。你可以直接使用JDBC来做到这一点:

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

将二进制数据读取到''String''不是一个好主意。 – f1sh

+0

@ f1sh我知道,但这是OP要求的。 – Alboz

+0

那我该怎么办?在将图像数据插入数据库blob之前,我应该在哪里放置图像数据? – foo

1

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

使用IOUtils来从InputStream一个byte[]

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

然后将其写入到数据库中。使用JDBC写BLOB和一个PreparedStatement看起来是这样的:

yourPreparedStatement.setBytes(nIndex, encoded); 
+0

我需要添加哪些进口? – foo

2

有很好的办法做到这一点是使用IOUtils到的InputStream转换为Byte Array ...

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

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

示例代码

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

现在你可以使用你的String