将InputStream转换为base64字符串

23

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

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

有没有办法做到这一点?

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


1
你有尝试过什么吗?如果你的InputStream包含图像数据,不要使用“String”,而应该使用“byte[]”。 - f1sh
好的,这是什么意思?我需要将这个字段更改为Byte[]类型,如何从输入流中将其转换为Byte[]呢?谢谢! - foo
5个回答

32

有一个不错的方法可以使用IOUtils将输入流转换为字节数组...

类似这样:

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

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

示例代码

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

现在您可以使用您的String


找不到IOUtils,请参考此链接https://dev59.com/AWAf5IYBdhLWcg3wgy4Y - joe_inz

30

新的FileInputStream需要获取文件 - 我没有文件名...我需要设置inputStream... - foo
只要你有InputStream,那应该没问题。你可以使用提到的逻辑。 - mhasan
Base64.DEFAULT - 编译错误- DEFAULT 不是字段。我需要做什么? - foo

3
最简单的方法是使用apache-commons中的IOUtils来实现此功能:IOUtils
String result= IOUtils.toString(inputStream, ENCODING); 

根据文档:

toString(byte[] input, String encoding) 使用指定的字符编码将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();

@f1sh 我知道,但这就是原帖所要求的。 - Alboz
那我该怎么办?在将图像数据插入到数据库 BLOB 之前,我应该把它放在哪里? - foo
@foo 如果你只想将InputStream保存到数据库中,你可以直接这样做,而不需要将其转换为其他任何形式... - Alboz
@foo 请查看我更新的答案,关于如何将InputStream直接持久化为Blob到数据库中。 - Alboz
对我来说,这是一种更加内存高效的方法,接受答案中的byte[]会占用它。您不需要一个临时空间来保持流。 - mcvkr

2

如我所述,您不应该使用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);

我需要添加哪个导入? - foo

1

如果有人正在寻找没有外部库的解决方案。Java8添加了Base64实用程序类,其中包含getEncoder()方法。Java9在InputStream上添加了一个名为readAllBytes()的花式方法链接到api

因此,现在您可以不使用任何外部库来编写代码

import java.io.InputStream;
import java.util.Base64;

public String encode(InputStream stream) throws IOException {
  final var bytes = stream.readAllBytes();

  return Base64.getEncoder().encodeToString(bytes);
}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接