2010-03-17 10 views
1

J'ai écrit une application Web Java qui permet à un utilisateur de télécharger des fichiers à partir d'un serveur. Ces fichiers sont assez volumineux et sont donc compressés avant le téléchargement.fichier zip téléchargé renvoie zéro a 0 octets comme taille

Il fonctionne comme ceci: 1.
L'utilisateur obtient une liste de fichiers qui correspondent à ses critères/ses
2. Si l'utilisateur aime un fichier et il veut télécharger il/elle choisit en cochant une case à cocher
3. l'utilisateur clique alors « télécharger »
4. les fichiers sont ensuite compressés et stockés sur un Servera
5. l'utilisateur présente ensuite présenté avec une page qui contient un lien vers le filea zip téléchargeable
6. Cependant en téléchargeant le fichier zip le fichier téléchargé est 0 octets en sizea

J'ai vérifié le serveur distant et le fichier zip est créé correctement, tout ce qui reste est de servir le fichier l'utilisateur en quelque sorte, pouvez-vous voir où je pourrais aller mal, ou suggérer une meilleure façon de servir le fichier zip .

Le code qui crée le lien est:

<% 
String zipFileURL = (String) request.getAttribute("zipFileURL"); %> 
<p><a href="<% out.print(zipFileURL); %> ">Zip File Link</a></p> 

Le code qui crée la variable zipFileURL est:

public static String zipFiles(ArrayList<String> fileList, String contextRootPath) { 
     //time-stamping 
      Date date = new Date(); 
     Timestamp timeStamp = new Timestamp(date.getTime()); 
    Iterator fileListIterator = fileList.iterator(); 
    String zipFileURL = ""; 

    try { 
     String ZIP_LOC = contextRootPath + "WEB-INF" + SEP + "TempZipFiles" + SEP; 
     BufferedInputStream origin = null; 
     zipFileURL = ZIP_LOC 
     + "FITS." + timeStamp.toString().replaceAll(":", ".").replaceAll(" ", ".") + ".zip"; 
     FileOutputStream dest = new FileOutputStream(ZIP_LOC 
       + "FITS." + timeStamp.toString().replaceAll(":", ".").replaceAll(" ", ".") + ".zip"); 
     ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(
       dest)); 

     // out.setMethod(ZipOutputStream.DEFLATED); 
     byte data[] = new byte[BUFFER]; 

     while(fileListIterator.hasNext()) { 

      String fileName = (String) fileListIterator.next(); 
      System.out.println("Adding: " + fileName); 
      FileInputStream fi = new FileInputStream(fileName); 
      origin = new BufferedInputStream(fi, BUFFER); 
      ZipEntry entry = new ZipEntry(fileName); 
      out.putNextEntry(entry); 
      int count; 
      while ((count = origin.read(data, 0, BUFFER)) != -1) { 
       out.write(data, 0, count); 
      } 
      origin.close();    
     } 

     out.close(); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

return zipFileURL; 
    } 

Répondre

1

Une URL ne peut pas accéder à tous les fichiers (directement) sous WEB-INF. Je suggère d'utiliser un servlet pour renvoyer le fichier à partir de tout emplacement où il a été enregistré

suggéreraient aussi d'enregistrer le fichier en dehors du contexte de votre webapp

+0

apprécierait un extrait de code de la façon dont j'utiliser un servlet retourne un fichier. Merci – Terman

+0

theres un exemple ici: http://helpdesk.objects.com.au/java/how-can-i-return-an-image-using-a-servlet – objects

Questions connexes