2017-03-08 2 views
2

Il existe un moyen de convertir inputStream en String, et de l'encoder en base64? Dans ma fonction, j'obtiens un paramètre InputStream, et j'ai besoin de l'insérer dans mon champ DB-oracle BLOB, il y a un moyen de le faire? (mon objet contient un champ String pour enregistrer l'image à l'intérieur, mais je ne trouve aucun moyen de convertir l'inputStream en String au format base64) Merci!java convert inputStream en base64 string

+0

Avez-vous essayé quelque chose? Si votre InputStream contient des données d'image, n'utilisez pas '' String'', utilisez '' byte [] ''. – f1sh

+0

Ok, qu'est-ce que ça veut dire? Je dois changer ce champ à Byte []? et comment puis-je le convertir en Byte [] à partir de inputStream? Merci! – foo

Répondre

5

Vous pouvez essayer quelque chose comme cela 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:

Comme je l'ai mentionné

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

+0

nouveau FileInputStream besoin d'obtenir le fichier - Je n'ai pas de nom de fichier .... Je dois définir inputStream .... – foo

+0

cela devrait être ok aussi longtemps que vous avez InputStream avec vous. vous utilisez la logique mentionnée – mhasan

+0

Base64.DEFAULT - get compilation error - DEFAULT n'est pas un champ. quel shuld je dois faire? – foo

1

La façon la plus simple serait d'utiliser IOUtils de apache-communes pour le faire:

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

De la documentation:

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

Après cela Pour Encode/Décodage 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") 

Note: Je suppose que vous utilisez 8 pour la JDK partie Coder/Décoder.

Apparemment, l'OP veut simplement conserver un InputStream dans le DB. Vous pouvez le faire en utilisant JDBC directement:

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

La lecture de données binaires dans un '' String'' n'est pas une bonne idée. – f1sh

+0

@ f1sh Je le sais mais c'est ce que le PO a demandé. – Alboz

+0

alors que puis-je faire? où dois-je mettre les données d'image avant de l'insérer dans DB blob? – foo

1

, vous ne devriez pas utiliser String pour les données binaires. Les données codées en base64 peuvent cependant être stockées en tant que chaîne. Mais puisque votre colonne de base de données est un blob, je continuerais à travailler avec un byte[].

Utilisez IOUtils pour obtenir un byte[] du InputStream:

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

écrire ensuite à la base de données. L'écriture d'un blob en utilisant jdbc et PreparedStatement ressemble à ceci:

yourPreparedStatement.setBytes(nIndex, encoded); 
+0

quelle importation je dois ajouter? – foo

2

Il est agréable façon de faire est d'utiliser IOUtils pour convertir le InputStream en Byte Array ...

quelque chose comme

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

Ici, vous pouvez utiliser Base64 pour convertir Byte Array en String.

Exemple de code

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

vous pouvez maintenant utiliser votre String.