zipper des fichiers

zipper des fichiers - Java - Programmation

Marsh Posté le 09-07-2009 à 14:10:27    

Bonjour,
je dois recuperer des fichiers sur un serveur, les zipper, puis les envoyer sur la sortie en telechargement (java web pour info).
 
J'ai un code qui compile mais le fichier semble etre corrompu. Il fait la taille du premier fichier que je lui passe seulement et ni windows ni 7zip ne peuvent l'ouvrir.
 
Voici mon code, en esperant que quelqu'un pourra m'aider.

Code :
  1. // These are the files to include in the ZIP file
  2. List<String> filenames = down.getFilenames();
  3. List<String> urls = down.getUrls();
  4. byte data[] = new byte[1024];
  5. try {
  6. HttpClient client = new HttpClient();
  7. // set default retry handler
  8. client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
  9. new DefaultHttpMethodRetryHandler());
  10. // Create the ZIP file
  11. String outFilename = "outfile.zip";
  12. FileOutputStream dest = new FileOutputStream(outFilename);
  13. BufferedOutputStream buff = new BufferedOutputStream(dest);
  14. ZipOutputStream out = new ZipOutputStream(buff);
  15. out.setMethod(ZipOutputStream.DEFLATED);
  16. out.setLevel(9);
  17. // Compress the files
  18. for (int i=0; i<filenames.size(); i++) {
  19. //make an HTTP GET
  20. HttpMethod method = new GetMethod(urls.get(i));
  21. client.executeMethod(method);
  22. InputStream is = method.getResponseBodyAsStream();
  23. BufferedInputStream buffi=new BufferedInputStream(is,1024);
  24. ZipEntry ze=new ZipEntry(filenames.get(i));
  25. // Add ZIP entry to output stream.
  26. out.putNextEntry(ze);
  27. int count;
  28. while((count = buffi.read(data, 0, 1024)) != -1) {
  29. out.write(data, 0, count);
  30. }
  31. // Complete the entry
  32. out.closeEntry();
  33. buffi.close();
  34. }
  35. out.finish();
  36. out.close();
  37. String zip=buff.toString();
  38. response.setContentType( "application/zip" );
  39. response.setHeader( "Content-Disposition", "attachment; filename=\""+outFilename+"\"" );
  40. ServletOutputStream op = response.getOutputStream();
  41. op.println(zip);
  42. op.flush();


---------------
Toinou87 ;-p May the force be with you!!
Reply

Marsh Posté le 09-07-2009 à 14:10:27   

Reply

Marsh Posté le 09-07-2009 à 14:51:28    

Precision:
je viens d'ouvrir le zip generer avec notepad, c'est l'envoie sur la sortie qui plante.
Le toString() n'envoie pas les données mais le type de l'objet.
Donc le fichier generer est un fichier texte avec BufferedInputStream.
 
Le probleme est donc:
passer les données de out ou buff à op


---------------
Toinou87 ;-p May the force be with you!!
Reply

Marsh Posté le 09-07-2009 à 15:23:37    

Mais pourquoi diable t'attends-tu à ce que toString() et println() envoient des données zippées ? [:pingouino]

 

T'as du binaire, pas des caractères.


Message édité par Taiche le 09-07-2009 à 15:24:20

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 09-07-2009 à 15:34:35    

bon alors le boulot du println c'est d'envoyer les données sur la sortie. En l'occurence ici ServletOutputStream et donc il me renvoie bien le fichier generer.
Par contre pour le toString, je l'avais pris sur un tuto que je retrouve pas et je pensais qu'il etait overriden pour renvoyer les bytes du bufferedinputstream dans une string.


---------------
Toinou87 ;-p May the force be with you!!
Reply

Marsh Posté le 09-07-2009 à 15:39:04    

Bin non, toString() ça renvoie une String, c'est la signature de la méthode [:spamafote] (c'est même son nom)
Pour println() non, son boulot c'est envoyer des chaînes, pas des tableaux de bytes. Vois plutôt du côté de write() [:petrus75]

 

Sinon, en vrac :
* t'as pas besoin de BufferedOutputStream, tu peux mettre direct ton FileOutputStream, ça t'évitera la création d'un objet.
* une fois que t'as fait close() sur ton ZipOutputStream, ton opération est terminée et tu devrais avoir tes données dans ton fichier... non ?
* pis révise un peu la notion de streams en Java, l'idée même de vouloir faire un toString ou de récupérer des données quelconques sur buff me fait peur [:dawao]


Message édité par Taiche le 09-07-2009 à 15:40:17

---------------
Everyone thinks of changing the world, but no one thinks of changing himself  |  It is the peculiar quality of a fool to perceive the faults of others and to forget his own  |  Early clumsiness is not a verdict, it’s an essential ingredient.
Reply

Marsh Posté le 09-07-2009 à 15:41:18    

trouvé, j'utilise comme constructeur du buffered output stream le servlet output stream et ca marche (bon j'avais trouvé ca y a 30 min mais les fichiers du serveurs etaient perimés et ca me renvoyait des fichier vides).
Il reste peut etre des artefacts d'erreurs.
 

Code :
  1. List<String> filenames = down.getFilenames();
  2.     List<String> urls = down.getUrls();
  3.     byte data[] = new byte[1024];
  4.    
  5.     try {
  6.      HttpClient client = new HttpClient();
  7.   // set default retry handler
  8.   client.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
  9.     new DefaultHttpMethodRetryHandler());
  10.   BufferedInputStream buffi=null;
  11.         // Create the ZIP file
  12.         String outFilename = "outfile.zip";
  13.        
  14.         response.setContentType( "application/zip" );
  15.         response.setHeader( "Content-Disposition", "attachment; filename=\""+outFilename+"\"" );
  16.         BufferedOutputStream buff = new BufferedOutputStream(response.getOutputStream());
  17.         ZipOutputStream out = new ZipOutputStream(buff);
  18.        
  19.         out.setMethod(ZipOutputStream.DEFLATED);
  20.         out.setLevel(9);
  21.        
  22.         // Compress the files
  23.         for (int i=0; i<filenames.size(); i++) {
  24.        
  25.          //make an HTTP GET
  26.       HttpMethod method = new GetMethod(urls.get(i));
  27.       client.executeMethod(method);
  28.    
  29.       InputStream is = method.getResponseBodyAsStream();
  30.    
  31.       buffi=new BufferedInputStream(is,1024);
  32.       ZipEntry ze=new ZipEntry(filenames.get(i));
  33.            
  34.             // Add ZIP entry to output stream.
  35.             out.putNextEntry(ze);
  36.            
  37.             int count;
  38.             while((count = buffi.read(data, 0, 1024)) != -1) {
  39.                 out.write(data, 0, count);
  40.                 System.out.println(count);
  41.             }
  42.             // Complete the entry
  43.             out.closeEntry();
  44.             buffi.close();
  45.         
  46.         }
  47.         out.finish();
  48.         out.close();
  49.        
  50.        
  51.         out.flush();


---------------
Toinou87 ;-p May the force be with you!!
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed