Servlet : faire un download d'un fichier zip

Servlet : faire un download d'un fichier zip - Java - Programmation

Marsh Posté le 27-10-2011 à 13:14:05    

Bonjour,
 
J'ai un fichier zip sur mon ddur, quand je clique sur l'icone telecharger du navigateur, je veux que ce fichier se télécharge.
Alors, le fichier sur le ddur est nickel. Mais alors quand je le telecharge, ça fait n'importe nawak : zip impossible a ouvrir, taille plus volumineuse...(pourquoi ?)
Voici mon code que j'ai trituré à maintes reprises, mais impossible d'avoir le bon code qui fait une copie de ce fichier (toto.zip sur le dur -> servlet -> téléchargement ; le fichier devrait rester identique :/) :
 

Code :
  1. //update zip file entry
  2.  File lF = new File( lSimuleaZipFilename );
  3.  HttpServletResponse httpResponse = PortalUtil
  4.    .getHttpServletResponse( pResponse );
  5.  httpResponse.setContentLength( (int) lF.length() );
  6.  httpResponse.setHeader( "Content-Disposition",
  7.    "attachment; filename=\"" + SIMULATOR_ZIP_FILENAME + "\"" );
  8.  httpResponse.setHeader( "Content-Transfer-Encoding", "binary" );
  9.  httpResponse.setContentType( "application/octet-stream" );
  10.  Writer out = httpResponse.getWriter();
  11.  FileInputStream lFis = new FileInputStream( lF );
  12.  DataInputStream in = new DataInputStream( lFis );
  13.  int data;
  14.  byte[] buffer = new byte[4096];
  15.  int bytesRead;
  16.  while ((bytesRead = in.read( buffer )) != -1)
  17.  {
  18.   out.write( new String( buffer ), 0, bytesRead );
  19.   buffer = new byte[4096];
  20.  }
  21.  in.close();
  22.  out.flush();
  23.  out.close();


 
Y-a-t-il un loup kkpart ?  :heink:


Message édité par Barnabe42 le 27-10-2011 à 13:14:59
Reply

Marsh Posté le 27-10-2011 à 13:14:05   

Reply

Marsh Posté le 30-10-2011 à 08:42:17    

Peut-être ici:
 

Code :
  1. out.write( new String( buffer ), 0, bytesRead );


 
Quel encoding est utilisé sur le serveur ?

Reply

Marsh Posté le 22-11-2011 à 14:45:38    

Tu utilises un Writer pour transmettre des données binaires, c'est sur que ça ne va pas marcher.

 

Pour transmettre des données binaires dans ta réponse, tu dois utiliser l'OutputStream fourni par ton objet httpResponse.

Message cité 1 fois
Message édité par Bidem le 22-11-2011 à 14:46:12
Reply

Marsh Posté le 23-11-2011 à 09:54:42    

Bidem a écrit :

Tu utilises un Writer pour transmettre des données binaires, c'est sur que ça ne va pas marcher.
 
Pour transmettre des données binaires dans ta réponse, tu dois utiliser l'OutputStream fourni par ton objet httpResponse.


 
 
Très bien, merci pour ta réponse, tu m'apprends quelque chose ... après 5 ans d'XP en java [:joce]
 
Le code qui marche :
 

Code :
  1. //update zip file entry
  2.  File lF = new File( lSimuleaZipFilename );
  3.  HttpServletResponse httpResponse = PortalUtil
  4.    .getHttpServletResponse( pResponse );
  5.  httpResponse.setContentLength( (int) lF.length() );
  6.  httpResponse.setHeader( "Content-Disposition",
  7.    "attachment; filename=\"" + lZipOutputFilename + "\"" );
  8.  httpResponse.setHeader( "Content-Transfer-Encoding", "binary" );
  9.  httpResponse.setContentType( "application/octet-stream" );
  10.  httpResponse.flushBuffer();
  11.  OutputStream out = httpResponse.getOutputStream();
  12.  FileInputStream lFis = new FileInputStream( lF );
  13.  DataInputStream in = new DataInputStream( lFis );
  14.  byte[] buffer = new byte[4096];
  15.  int bytesRead;
  16.  while ((bytesRead = in.read( buffer )) != -1)
  17.  {
  18.   out.write( buffer, 0, bytesRead );
  19.   buffer = new byte[4096];
  20.  }
  21.  in.close();
  22.  out.flush();
  23.  out.close();


Message édité par Barnabe42 le 23-11-2011 à 09:56:08

---------------
Asus Z87-A, Core i7 4790K@Stock, G.Skill 4x8Go 2800MHz CL12, Nvidia GTX 980@1178/1752, Asus PB287Q 4K@60Hz | CPU-Z validator | Post image
Reply

Marsh Posté le 25-03-2014 à 10:18:37    

Bonjour,
j'essaie de faire la même chose mais je n'y arrive toujours pas !! pourriez vous m'aider svp ?
voici mon code :


Message édité par Sbarney le 25-03-2014 à 10:19:31
Reply

Marsh Posté le 25-03-2014 à 10:20:35    

Bonjour,
j'essaie de faire la même chose mais je n'y arrive toujours pas !! pourriez vous m'aider svp ?
voici mon 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.    }

Reply

Sujets relatifs:

Leave a Replay

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