2010-10-11 5 views
1

J'essaie de créer une servlet de téléchargement qui gère enctype = "multipart/form-data" à partir d'un formulaire. Le fichier que j'essaie de télécharger est un zip. Cependant, je peux télécharger et lire le fichier sur localhost, mais quand je télécharge sur le serveur, j'obtiens une erreur "Fichier non trouvé" quand je veux télécharger un fichier. Est-ce dû au cadre Struts que j'utilise? Merci de votre aide. Voici une partie de mon code, j'utilise FileUpload de http://commons.apache.org/fileupload/using.htmlProblème FileUpload avec Struts sur le serveur

J'ai changé pour utiliser ZipInputStream, cependant, comment faire référence au zip ZipFile sans utiliser une adresse de disque local (ie: C: //zipfile.zip). zip est nul car il n'est pas instancié. Je devrai décompresser et lire le zipentry en mémoire, sans écrire au serveur.

Pour la servlet de téléchargement: > zip ZipFile privé; lecteur CSVReader privé; boolean isMultipart = ServletFileUpload.isMultipartContent (requête); if (isMultipart) { DiskFileItemFactory usine = new DiskFileItemFactory();

 ServletFileUpload upload = new ServletFileUpload(factory); 
     List <FileItem> items = upload.parseRequest(request); 
     Iterator iter = items.iterator(); 
     while (iter.hasNext()) { 
      //Iterating through the uploaded zip file and reading the content 
      FileItem item = (FileItem) iter.next(); 

      ZipInputStream input = new ZipInputStream(item.getInputStream()); 
      ZipEntry entry = null; 
      while ((entry= input.getNextEntry()) != null) { 
       ZipEntry entry = (ZipEntry) e.nextElement(); 
       if(entry.getName().toString().equals("file.csv")){ 
        //unzip(entry) 
       } 

       } 
      } 


    public static void unzip(ZipEntry entry){ 
     try{ 
      InputStream inputStream = **zip**.getInputStream(entry); 
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream); 
      reader = new CSVReader(inputStreamReader); 
     } 
     catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 

<

Répondre

0

Ici,

zip = new ZipFile(new File(fileName)); 

Vous êtes en supposant que le système de fichiers de disque local sur la machine serveur contient déjà le fichier avec exactement le même nom que ce soit au client côté. C'est une mauvaise hypothèse. Cela a fonctionné à localhost est évidemment parce que le webbrowser et le webserver "par coïncidence" fonctionne physiquement la même machine avec le même système de fichiers de disque.

En outre, vous semblez utiliser Internet Explorer en tant que navigateur qui inclut de manière incorrecte le chemin complet dans le nom de fichier comme C:/full/path/to/file.ext. Vous ne devriez pas compter sur ce bug spécifique au navigateur. D'autres navigateurs comme Firefox n'envoient correctement que le nom du fichier comme file.ext, ce qui à son tour aurait causé un échec avec new File(fileName) (ce qui aurait dû vous aider à repérer votre erreur beaucoup plus tôt).

Pour résoudre ce « problème », vous devez obtenir le fichier contenu comme InputStream par item.getInputStream():

ZipInputStream input = new ZipInputStream(item.getInputStream()); 
// ... 

Ou pour écrire sur le disque par item.write(file) et référence dans ZipFile:

File file = File.createTempFile("temp", ".zip"); 
item.write(file); 
ZipFile zipFile = new ZipFile(file); 
// ... 

Remarque: n'oubliez pas de vérifier l'extension du fichier au préalable, sinon cela pourrait s'étouffer.

+0

merci pour votre réponse, mais je suis bloqué à référencer le zip ZipFile. Je ne peux pas le faire fonctionner sans référencer le fichier réel, ce qui ne fonctionnera pas sur le serveur réel. J'ai modifié les codes ci-dessus. – JustToHelp

+0

Ecrivez-le sur le disque, puis référencez 'File' comme' ZipFile'. – BalusC

+0

voulez-vous dire ZipFile zip = (ZipFile) item.write (file)? Ce fichier fera référence à où? – JustToHelp

Questions connexes