web-dev-qa-db-fra.com

java convertir inputStream en chaîne base64

Il existe un moyen de convertir inputStream en chaîne et de le coder en base64, non? Dans ma fonction, j'obtiens le paramètre InputStream et je dois l'insérer dans le champ BLOB de ma table de base de données Oracle. Y-a-t-il un moyen de faire ça? (mon objet de base de données contient un champ de chaîne pour enregistrer l'image, mais je ne trouve aucun moyen de convertir le inputStream en chaîne au format base64) Merci!

12
foo

Vous pouvez essayer quelque chose comme ça en utilisant l'API Base64.

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

Utilisez ceci:

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

19
mhasan

Il y a une bonne façon de le faire en utilisant IOUtils pour convertir le InputStream en Byte Array...

quelque chose comme

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

Ici, vous pouvez utiliser Base64 convertir Byte Array à String.

Exemple de code

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

Vous pouvez maintenant utiliser votre String.

10
Raj S. Rusia

Le moyen le plus simple serait d'utiliser IOUtils d'Apache-commons pour le faire:

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

De la documentation:

toString (entrée octet [], encodage de chaîne) Obtient le contenu d'un octet [] sous forme de chaîne en utilisant l'encodage de caractères spécifié.

Après cela, pour encoder/décoder en Base64:

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


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

Remarque: Je suppose que vous utilisez JDK 8 pour la partie Encode/Decode.

Apparemment, l'OP souhaite simplement conserver un InputStream dans la base de données. Vous pouvez le faire directement en utilisant 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

Comme je l'ai mentionné, vous ne devez pas utiliser String pour les données binaires. Les données encodées en base64 peuvent cependant être stockées sous forme de chaîne. Mais comme votre colonne de base de données est un blob, je continuerais à travailler avec un byte[].

Utilisez IOUtils pour obtenir un byte[] à partir du InputStream:

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

Ensuite, écrivez-le dans la base de données. L'écriture d'un blob à l'aide de jdbc et d'un PreparedStatement ressemble à ceci:

yourPreparedStatement.setBytes(nIndex, encoded);
1
f1sh