créer un fichier zip et le télécharger

créer un fichier zip et le télécharger - Java - Programmation

Marsh Posté le 25-03-2014 à 10:28:54    

Bonjour,
J'ai créé un bouton qui permet de créer un fichier zip., La fonction qui compresse le fichier fonctionne correctement ( quand je la test en console), mais quand je l'appelle via le bouton (dans le fichier JS), il se bloque et il donne une page blanche (je crois que je ne gère pas  le flux de sortie) auriez vous une idée svp  ?
Merci d'avance.

 

voici le code:
 

Code :
  1. public ZipOutputStream zipIt(String zipFile){
  2.      //String sReturn = "sReturnb_KO";
  3.      byte[] buffer = new byte[1024];
  4.      ZipOutputStream op = null;
  5.      ZipOutputStream zos = null;
  6.      try{
  7.      FileOutputStream fos = new FileOutputStream(zipFile);
  8.      zos = new ZipOutputStream(fos);
  9.      System.out.println("Output to Zip : " + zipFile);
  10.      for(String file : this.fileList){
  11.       System.out.println("File Added : " + file);
  12.       ZipEntry ze= new ZipEntry(file);
  13.          zos.putNextEntry(ze);
  14.          FileInputStream in =
  15.                        new FileInputStream(SOURCE_FOLDER + File.separator + file);
  16.          System.out.println("FileInputStream : "+SOURCE_FOLDER + File.separator + file);
  17.          int len;
  18.          while ((len = in.read(buffer)) > 0) {
  19.           zos.write(buffer, 0, len);
  20.          }
  21.          in.close();
  22.      }
  23.      zos.closeEntry();
  24.    
  25.      zos.close();
  26.      //sReturn = "sReturnb_OK";
  27.      System.out.println("Done" );
  28.    
  29.    
  30.     }catch(IOException ex){
  31.        ex.printStackTrace(); 
  32.     }
  33.      return zos;
  34.    }


Message édité par Sbarney le 25-03-2014 à 10:29:40
Reply

Marsh Posté le 25-03-2014 à 10:28:54   

Reply

Marsh Posté le 25-03-2014 à 13:34:06    

en faisant un flush de ton stream sortant ?

Reply

Marsh Posté le 25-03-2014 à 17:31:20    

J'imagine que ta méthode zipIt est lancée par une servlet.
 
Ton ZipOutputStream écrit dans un fichier donc il faut que ta servlet lise ce fichier et écrive les données dans la réponse.
 
Une autre façon de faire, serait de mettre l'OutputStream de la response en parametre de la méthode zipIt et d'écrire directement dedans (en plus ça évite de créer un fichier intermédiaire inutile)

Reply

Marsh Posté le 26-03-2014 à 11:18:44    

@bidem
oui justement, il faut lire ce fichier et écrire ensuite les données dans la réponse et c'est là que je trouve le problème  :fou:  :fou:  
je trouve pas une fonction pour écrire dans la fichier telle la fonction write() qui prend en paramètre un objet de type OutputStream !!
et je peux pas non plus passer en paramètre un objet de type OutputStream  car je suis entrain de zipper un répertoire et j'utilise des fonctions de la classe ZipOutputStream qui ne seront donc pas accessible depuis ce paramètre !!

Reply

Marsh Posté le 26-03-2014 à 12:12:05    

Récupération de l'OutputStream (response est le paramètre HttpServletResponse de ta méthode doGet) :

Code :
  1. OutputStream out = response.getOutputStream();
 

Dans zipIt, tu peux remplacer le FileOutputStream (fos) par out.

 
Code :
  1. public ZipOutputStream zipIt(OutputStream out) {
  2.     //String sReturn = "sReturnb_KO";
  3.     byte[] buffer = new byte[1024];
  4.     ZipOutputStream zos = null;
  5.     try{
  6.       // branchement du ZipOutputStream sur out
  7.       zos = new ZipOutputStream(out);
  8.       for(String file : this.fileList){
  9.         System.out.println("File Added : " + file);
  10.         ZipEntry ze= new ZipEntry(file);
  11.         zos.putNextEntry(ze);
  12.         FileInputStream in =
  13.             new FileInputStream(SOURCE_FOLDER + File.separator + file);
  14.         System.out.println("FileInputStream : "+SOURCE_FOLDER + File.separator + file);
  15.         int len;
  16.         while ((len = in.read(buffer)) > 0) {
  17.           zos.write(buffer, 0, len);
  18.         }
  19.         in.close();
  20.       }
  21.       zos.closeEntry();
  22.       zos.close();
  23.       //sReturn = "sReturnb_OK";
  24.       System.out.println("Done" );
  25.     }catch(IOException ex){
  26.       ex.printStackTrace();
  27.     } finally {
  28.       // fermeture du flux
  29.       if (zos != null) {
  30.         try {
  31.           zos.flush();
  32.           zos.close();
  33.         } catch (IOException e) {
  34.           e.printStackTrace();
  35.         }
  36.       }
  37.     }
  38.     return zos;
  39.   }
 

NB : j'ai aussi ajouté la fermeture du flux dans le bloc finally


Message édité par Bidem le 26-03-2014 à 12:15:05
Reply

Marsh Posté le 26-03-2014 à 13:02:03    

je te remercie bidem !
par contre je pense que tu as oublié d'enlever "zos.close();" qui au dessus (ligne 29)
je teste ça et je te redis :)


Message édité par Sbarney le 26-03-2014 à 13:02:44
Reply

Sujets relatifs:

Leave a Replay

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