foo
foo

Reputation: 481

Convert InputStream to base64 string

There is a way to convert an InputStream to a String, and encode it to base64, right?

In my function, I get InputStream parameter, and need to insert it into the BLOB field in my Oracle database table.

Is there a way to do that?

(My database object contains string field to save the image, but I don't find any way to convert the InputStream to string in base 64 format.)

Upvotes: 24

Views: 92978

Answers (5)

emptak
emptak

Reputation: 592

In case someone is looking for solution without external libraries. Java8 adds Base64 utility class which contains getEncoder() method. Java9 adds fancy method on InputStream called readAllBytes() Link to api

So now you without any external libraries your code may look like

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);
}

Upvotes: 2

Raj Rusia
Raj Rusia

Reputation: 736

There is nice way to do this is using IOUtils to convert the InputStream into a Byte Array...

something like

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

Here you can use Base64 to convert Byte Array to String.

Sample Code

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

Now you can use your String.

Upvotes: 33

Alboz
Alboz

Reputation: 1851

The simplest way would be to use IOUtils from apache-commons to do that:

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

From the documentation:

toString(byte[] input, String encoding) Gets the contents of a byte[] as a String using the specified character encoding.

After that To Encode/Decode in Base64:

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


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

Note: I'm assuming you use JDK 8 for the Encode/Decode part.

Apparently the OP wants just to persist an InputStream to the DB. You can do that directly using JDBC:

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

Upvotes: 3

mhasan
mhasan

Reputation: 3709

You can try something like this using the 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);

Use this:

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

Upvotes: 30

f1sh
f1sh

Reputation: 11943

As I mentioned, you shouldn't use String for binary data. The base64-encoded data can be stored as a String though. But since your database column is a blob, I would continue to work with a byte[].

Use IOUtils to get a byte[] from the InputStream:

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

Then write it to the database. Writing a blob using jdbc and a PreparedStatement looks like this:

yourPreparedStatement.setBytes(nIndex, encoded);

Upvotes: 2

Related Questions