Reputation: 481
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
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
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
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
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:
Upvotes: 30
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