web-dev-qa-db-ja.com

java inputStreamをbase64文字列に変換する

InputStreamをStringに変換し、base64にエンコードする方法はありますか?私の関数では、InputStream paramを取得し、それをOracleデータベーステーブルのBLOBフィールドに挿入する必要があります。それを行う方法はありますか? (私のデータベースオブジェクトには画像を保存する文字列フィールドが含まれていますが、inputStreamをbase64形式の文字列に変換する方法が見つかりません)ありがとうございます!

12
foo

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

19
mhasan

これを行うには、 IOUtils を使用してInputStreamをByte Array...に変換するのが良い方法です。

何か

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

ここでは、Base64を使用してByte ArrayStringに変換できます。

サンプルコード

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

これで、Stringを使用できます。

10
Raj S. Rusia

最も簡単な方法は、Apache-commonsの 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")

注:Encode/Decodeパートに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
Alboz

前述したように、バイナリデータにStringを使用しないでください。ただし、base64でエンコードされたデータはStringとして保存できます。ただし、データベース列は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);
1
f1sh