2012-06-13 5 views
2

J'ai téléchargé mon zip archive sur le serveur et que vous voulez ouvrir .txt et .jpg fichiers dedans. J'ai réussi à obtenir mes archives dans mon contrôleur et obtenir le nom de chaque fichier via ZipEntry. Maintenant, je veux l'ouvrir, mais pour cela, je devrais obtenir un chemin complet vers mon fichier.Printemps: comment analyser le fichier zip téléchargé?

Je n'ai pas trouvé comment je peux le faire. Pourriez-vous suggérer une approche pour ce faire?

Mise à jour

J'essaie d'utiliser par exemple ont été proposées ci-dessous, mais je ne suis pas en mesure d'ouvrir le fichier

ZipFile zFile = new ZipFile("trainingDefaultApp.zip"); 

J'ai la FileNotFoundException

Je reviens à mon point de départ. J'ai un formulaire de téléchargement dans l'application Java Spring. Dans le contrôleur j'avais obtenu une archive zip comme byte[]

@RequestMapping(method = RequestMethod.POST) 
public String create(UploadItem uploadItem, BindingResult bindingResult){ 
    try { 
     byte[] zip = uploadItem.getFileData().getBytes(); 
     saveFile(zip); 

Je l'avais obtenu chaque ZipEntry

InputStream is = new ByteArrayInputStream(zip); 
    ZipInputStream zis = new ZipInputStream(is); 

    ZipEntry entry = null; 
    while ((entry = zis.getNextEntry()) != null) { 
     String entryName = entry.getName(); 
     if (entryName.equals("readme.txt")) { 
      ZipFile zip = new ZipFile(entry.getName()); // here I had got an exception 

Selon docs, je fait tout droit, mais comme pour moi, il est étrange de ne laisser passer que le nom du fichier et soupçonne que vous allez ouvrir avec succès le fichier

+0

Que voulez-vous dire? Vous avez dit que vous l'ouvrez avec succès; à quoi n'avez-vous pas de "chemin complet"? –

+0

J'ai ouvert CommonsMultipartFile qui contient mon archive zip comme octet []. Je le convertis en ZipInputStream et en boucle j'ai un ZipEntry pour chaque fichier dans mes archives. Maintenant, je veux lire ce fichier .txt et le fichier .jpg, mais ZipEntry ne contient que les noms de ces fichiers. Donc je n'ai pas un chemin complet vers ces fichiers et je ne peux pas l'ouvrir en tant que nouveau fichier ("d: /some.txt") –

Répondre

0

Je résous mon uissue. La solution fonctionne directement avec ZipInputStream. Ici, le code:

private void saveFile(byte[] zip, String name, String description) throws IOException { 
    InputStream is = new ByteArrayInputStream(zip); 
    ZipInputStream zis = new ZipInputStream(is); 

    Application app = new Application(); 
    ZipEntry entry = null; 
    while ((entry = zis.getNextEntry()) != null) { 
     String entryName = entry.getName(); 
     if (entryName.equals("readme.txt")) { 
      new Scanner(zis); //!!! 
      //... 
      zis.closeEntry(); 
1

zipFile.getInputStream(ZipEntry entry) vous retournera le flux d'entrée pour l'entrée spécifique.

Consultez le javadocs pour ZipFile.getInputStream() - http://docs.oracle.com/javase/6/docs/api/java/util/zip/ZipFile.html#getInputStream(java.util.zip.ZipEntry).

Mise à jour:

J'ai mal lu votre question. Pour utiliser le ZipInputStream, il existe un exemple de code sur le site Web d'Oracle (http://java.sun.com/developer/technicalArticles/Programming/compression/) qui vous montre comment lire dans le flux. Voir le premier exemple de code: Code

  • Exemple 1: UnZip.java.

copie ici, il est en train de lire l'entrée et l'écrire directement dans un fichier, mais vous pouvez le remplacer par tout ce que la logique dont vous avez besoin:

ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis)); 
ZipEntry entry; 
while((entry = zis.getNextEntry()) != null) { 
    System.out.println("Extracting: " +entry); 
    int count; 
    byte data[] = new byte[BUFFER]; 
    // write the files to the disk 
    FileOutputStream fos = new FileOutputStream(entry.getName()); 
    dest = new 
    BufferedOutputStream(fos, BUFFER); 

    while ((count = zis.read(data, 0, BUFFER)) != -1) { 
     dest.write(data, 0, count); 
    } 
} 
+0

Mon mauvais, juste vu que vous avez un ZipInputStream, pas un ZipFile. Il y a un exemple de code sur le site Web d'Oracle (http://java.sun.com/developer/technicalArticles/Programming/compression/) qui vous montre comment lire le flux.Voir le premier exemple de code: Code Sample 1: UnZip.java. –

+0

Mmm ... comment puis-je utiliser ZipFile? Dans consructor je devrais passer le fichier que je ne peux pas créer sans un chemin complet vers ce fichier. Dans le cas où je passe le nom du fichier en tant que chaîne, j'ai FileNotFoundException –

+0

J'essaye cet exemple. J'ai la même excuse. Il dit que ce fichier n'a pas été trouvé. Pour le test j'ai codé en dur le nom de mon archive "tetx.zip" mais j'ai échoué quand j'ai essayé de créer un nouveau FileInputStream ("tetx.zip"). Est-ce faux ou le problème dans un autre endroit? –

Questions connexes