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 :
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();
A partir de cette endroit j'ai essaye de stocker l'image dans le BDD pour cela j'ai teste 2 methodes differentes :
- 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 :

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();
Ensuite je recupere ces donnees avec un getBinaryStream ou getBytes en fonction de la fonction que j'utilise.

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

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

- J'ai aussi l'affichage par la response comme montrer dans ce topic (http://www.developpez.net/forums/d60...-apartir-byte/)

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());
Meme probleme que plus haut, ca marche avec "imageInByte" mais rien a faire avec ce que je recois de la BDD.


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.