Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2949 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  zipper des fichiers

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

zipper des fichiers

n°1904063
Toinou87
That misread could have been.
Posté le 09-07-2009 à 14:10:27  profilanswer
 

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!!
mood
Publicité
Posté le 09-07-2009 à 14:10:27  profilanswer
 

n°1904095
Toinou87
That misread could have been.
Posté le 09-07-2009 à 14:51:28  profilanswer
 

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!!
n°1904108
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 09-07-2009 à 15:23:37  profilanswer
 

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.
n°1904116
Toinou87
That misread could have been.
Posté le 09-07-2009 à 15:34:35  profilanswer
 

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!!
n°1904118
Taiche
(╯°□°)╯︵ ┻━┻
Posté le 09-07-2009 à 15:39:04  profilanswer
 

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.
n°1904119
Toinou87
That misread could have been.
Posté le 09-07-2009 à 15:41:18  profilanswer
 

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!!

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  zipper des fichiers

 

Sujets relatifs
Comparer valeurs de 3 fichiers et en afficher le resultatFichiers requis LibUSB
probléme de numerotation des fichiers lors du download[VBS][RESOLU][SCRIPT]Script de suppression de fichiers temporaires
Macro : Chercher les bons fichiers de liaisons.Tableaux - Fichiers - Fonctions - Procédures
zipper des fichiers en phpZipper fichiers sans recup chemin d'accès
Zipper des fichiers sous delphiZipper des fichiers à partir de VB ?
Plus de sujets relatifs à : zipper des fichiers


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR