Bonjour,
J'ai un petit probleme, j'arrive a upper des images sur mon serveur, les stocker dans la BDD (bien qu'elles semblent mal stockees) type bytea.
Cependant lorsque j'essaye de les recupere cela ne me donne rien.
Je vous montre le code :
A partir de cette endroit j'ai essaye de stocker l'image dans le BDD pour cela j'ai teste 2 methodes differentes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 BufferedImage bufferedImage = ImageIO.read(new File(path)); // path correspond au chemin de stockage de l'image sur le serveur, c'est le bon j'arrive a l'affiche grace a un servlet d'affichage (avec l'idee de cette discution : <a href="http://www.developpez.net/forums/d604573/java/general-java/apis/io/creer-image-apartir-byte/" target="_blank">http://www.developpez.net/forums/d60...-apartir-byte/</a>) ByteArrayOutputStream baos = new ByteArrayOutputStream(); ImageIO.write(bufferedImage, exten, baos); // exten correspond a l'extension de l'image baos.flush(); byte[] imageInByte = baos.toByteArray(); baos.close();
- Utiliser le "imageInByte" et utilise la method setBytes
- Ouvrir le fichier fraichessement uppe sur le serveur pour recupere un InputStream dessus et utilise la method setBinaryStream
En code ca donne :
Ensuite je recupere ces donnees avec un getBinaryStream ou getBytes en fonction de la fonction que j'utilise.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 File file = new File(path); // Meme path que plus haut. FileInputStream fis = new FileInputStream(file); ps.setInt(1, Integer.parseInt(42)); ps.setBinaryStream(2, fis, (int)file.length()); /*ps.setBytes(2, sto);*/ ps.executeUpdate();
Jusque la ca marche bien que apres certains tests j'ai essaye de compare la taille de "imageInByte" avec celle recupere de la BDD (et la je me rencontre que la taille est differente. J'ai teste la taille juste avant d'upper dans la BDD elle est aussi differente entre ce que je stock et ce que je recupere).
Ensuite pour l'affichage j'ai encore teste plusieurs methodes sur "imageInByte" et sur ce que je recupere de la BDD :
- J'ai recreer les deux images
Avec "imageInByte" cela me redonne la bonne image meme taille, en recuperant de la BDD impossible d'affiche l'image et taille differente (pour ca j'ai ete checker directement sur le serveur).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 File monImage = new File(newPATH); //avec l'extention de base de l'image FileOutputStream ostreamImage = new FileOutputStream(monImage); byte[] buffer = new byte[1024]; int length = 0; InputStream istreamImage = new ByteArrayInputStream(imageInByte); // ou getBinaryStream(1) ou new ByteArrayInputStream(getBytes(1)) while((length = istreamImage.read(buffer)) != -1) { response.getWriter().print("buffer :" + buffer + " length : " + length + "\n"); ostreamImage.write(buffer, 0, length); }
- J'ai aussi l'affichage par la response comme montrer dans ce topic (http://www.developpez.net/forums/d60...-apartir-byte/)
Meme probleme que plus haut, ca marche avec "imageInByte" mais rien a faire avec ce que je recois de la BDD.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 response.setContentType("image/" + exten); InputStream is = new ByteArrayInputStream(imageInByte); // ou avec getBytes ou getBinaryStream BufferedImage image = ImageIO.read(is); ImageIO.write(image, exten, response.getOutputStream());
Donc je pense que ca vient surement au moment du stockage mais je ne vois comment, si quelqu'un a une idee.
PS : J'utilise Tomcat 7.0, jre6, jdk1.6 et postgresql-8.4-701.jdbc4 comme jar pour la connection avec la BDD et Postgresql 9.0.
Merci d'avance.
Partager