Bonjour à tous ,
Voilà j'ai réalisé un programme qui extrait des images d'une base de donnés (contenues dans un blob), ces images sont ensuite compressées en JPG puis doivent être réinjectées dans cette même base.
Malheureusement, impossible de mettre à jour le BLOB associé.
J'ai d'abord testé avec l'exemple ci-dessous (issus de http://ricky81.developpez.com/tuto [...] blob/#L3.2)
Code :
- File monImage = new File(vTableValue);
- FileInputStream istreamImage = new FileInputStream(monImage);
- PreparedStatement ps = connection.prepareStatement("UPDATE TABLE SET IMAGE_NAME=?, IMAGE_TYPE=?, IMAGE=? where R_ID='"+R_ID+"'" );
- ps.setString(1, NAME);
- ps.setString(2, MIME);
- ps.setBinaryStream(3, istreamImage, (int)monImage.length());
- ps.executeUpdate();
- ps.close();
|
Visiblement, ça ne fonctionne pas, le programme de lecture (utilisé initialement pour extraire les images de la base pointe sur un "NULL" lorsque j'essaie d'extraire l'image ainsi insérée). Aucune exception n'est cependant levée.
J'ai donc ensuite tenté avec un tableau de byte:
Code :
- File monImage = new File(vTableValue);
- FileInputStream istreamImage = new FileInputStream(monImage);
- int size = istreamImage.available();
- byte[] tab = new byte[size];
- istreamImage.read(tab);
- PreparedStatement ps = connection.prepareStatement("UPDATE SPECIALS_PRODUCT SET IMAGE=? where R_ID='"+R_ID+"'" );
- ps.setBytes(1, tab);
- ps.executeUpdate();
- ps.close();
|
Cette deuxième méthode fonctionne mais pour des images inférieures à 4ko. Sinon, une exception est levée:
Code :
- java.sql.SQLException: La taille des données est supérieure à la taille max. pour ce type: 9717
- at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
- at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
- at oracle.jdbc.ttc7.TTCItem.setArrayData(TTCItem.java:95)
- at oracle.jdbc.dbaccess.DBDataSetImpl.setBytesBindItem(DBDataSetImpl.java:2414)
- at oracle.jdbc.driver.OraclePreparedStatement.setItem(OraclePreparedStatement.java:1134)
- at oracle.jdbc.driver.OraclePreparedStatement.setBytes(OraclePreparedStatement.java:2170)
- at com.steelcase.image.ImageInsertBdD.sauveIMG(ImageInsertBdD.java:88)
- at com.steelcase.image.ImageInsertBdD.main(ImageInsertBdD.java:34)
|
D'après la structure de la base, le BLOB est défini à 4000 or l'application "Web" client derrière peut mettre des images largement supérieures (2,3,4Mo).
Je suis un peu "sec" sur le sujet, le net conseillant d'utiliser la première méthode qui ne passe pas chez moi.
Avez-vous des pistes?
Merci
Message édité par TomZ le 06-11-2008 à 17:48:07