2017-09-07 1 views
0

J'essaie de récupérer un fichier zip de ma base de données, mais chaque fois que le fichier zip généré est corrompu. Le zip est censé contenir 3 fichiers pdf, mais quand je le génère, il ne contient que le premier avec la taille 0 et quand j'essaye d'ouvrir le zip, la fenêtre d'erreur "Fin inattendue de l'archive" est affichée. Je ne peux pas comprendre ce qui ne va pas, car le fichier dans la base de données n'est pas corrompu et le code fonctionne sur mon PC, et beaucoup d'autres serveurs distants, mais pas sur un serveur distant spécifique (tous fonctionnent sur wildfly 10, même configuration de base de données mysql, avec le même zip stocké dans la base de données). Mon code est le suivant (JDBC):Impossible d'obtenir le fichier zip de la colonne longblob de la base de données MySQL avec java

... 
Statement stmt = conn.createStatement(); 
ResultSet rsstmt.executeQuery("SELECT document_data from table " 
      + "WHERE condition"); 

if (rs.next() && rs.getBytes("document_data") != null) { 
     ByteArrayInputStream(rs.getBytes("document_data")); 
     File zipped= new File("exported.zip"); 
     FileOutputStream fos = new FileOutputStream(zipped); 

     byte[] buffer = new byte[1]; 
     InputStream is = rs.getBinaryStream(1); 
     while (is.read(buffer) > 0) { 
      fos.write(buffer);   
     } 
     fos.close(); 
} 

J'ai essayé le code suivant aussi, mais ne fonctionne pas non plus:

InputStream in = null;//zip bytes 
OutputStream out;//zip archive to be generated 
. 
. 
. 
if (rs.next() && rs.getBytes("document_data") != null) { 
    in = new ByteArrayInputStream(rs.getBytes("document_data")); 
} 
out = new FileOutputStream("exported.zip"); 
byte[] buf = new byte[1024]; 
int len; 
while ((len = in.read(buf)) > 0) { 
    out.write(buf, 0, len); 
} 
in.close(); 
out.close(); 

Lors de l'exécution de la requête SQL suivante, le zip généré est pas corrompu :

SELECT document_data INTO DUMPFILE '/tmp/exported.zip' FROM table WHERE condition; 

REMARQUE: La taille de zip dans la base de données (champ LONGBLOB) est 830K.

REMARQUE: J'ai essayé avec JDBC et Hibernate, mais le résultat est le même.

Des idées sur ce comportement étrange?

+0

Mauvais jeu de caractères peut-être? –

+0

@RaymondNijland no ... – FunnyJava

+1

Si le code est correct (s'exécute sur différents serveurs) alors il y a probablement quelque chose de mal avec le serveur ... Avez-vous vérifié le chemin du fichier pour l'accès/free storange? – Jan

Répondre

0

Vous appelez tous les deux le getBytes(), qui lit le blob, puis lit son flux d'entrée qui, à ce stade, sera vide.

Débarrassez-vous de l'appel getBytes().

+0

J'ai essayé 'out.write (rs.getBytes (" document_data "));' sans flux d'entrée, mais cela n'a pas fonctionné non plus – FunnyJava