Stockage récupère image BDD (POSTGRESQL)
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:
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:
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:
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:
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.