Bibliothèque utilitaire Java pour la gestion de fichiers ZIP imbriqués


Je suis conscient que Oracle note les méthodes compresseurs/décompresseurs de fichiers ZIP/GZIP sur leur site Web. Mais j'ai un scénario où je dois analyser et savoir si des ZIPs/RAR imbriqués sont impliqués. Par exemple, le cas suivant:

-MyFiles.zip
   -MyNestedFiles.zip
        -MyMoreNestedFiles.zip
           -MoreProbably.zip
        -Other_non_zips
   -Other_non_zips
-Other_non_zips

Je sais que apache commons compresse le paquet et java.util.zip sont les paquets wideley utilisés où commons compress répond réellement aux fonctionnalités manquantes en java.util.zip, par exemple, certains paramètres de caractères tout en faisant des fermetures éclair. Mais ce que je suis je ne sais pas à propos des utilitaires pour la récurrence à travers les fichiers zip imbriqués et les réponses fournies sur SO ne sont pas de très bons exemples de le faire. J'ai essayé le code suivant (que j'ai obtenu du blog Oracle), mais comme je le soupçonnais, la récursivité du répertoire imbriqué échoue car il ne peut tout simplement pas trouver les fichiers:

public static void processZipFiles(String pathName) throws Exception{
        ZipInputStream zis  = null;
        InputStream  is = null;
        try {
          ZipFile zipFile = new ZipFile(new File(pathName));
          String nestPathPrefix = zipFile.getName().substring(0, zipFile.getName().length() -4);
          for(Enumeration e = zipFile.entries(); e.hasMoreElements();){
           ZipEntry ze = (ZipEntry)e.nextElement();
            if(ze.getName().contains(".zip")){
              is = zipFile.getInputStream(ze);
              zis = new ZipInputStream(is);
              ZipEntry zentry = zis.getNextEntry();

              while (zentry!=null){
                  System.out.println(zentry.getName());
                  zentry = zis.getNextEntry();
                  ZipFile nestFile = new ZipFile(nestPathPrefix+"\\"+zentry.getName());
                  if (zentry.getName().contains(".zip")) {
                      processZipFiles(nestPathPrefix+"\\"+zentry.getName());
                  }
              }
              is.close();
            }
          }
        } catch (FileNotFoundException e) {
          e.printStackTrace();
        } catch (IOException e) {
          e.printStackTrace();
        } finally{
            if(is != null)
                is.close();
            if(zis!=null)
                zis.close();
        }
    }  

Peut - être que je fais quelque chose de mal-ou que j'utilise les mauvais utils. Mon objectif est d'identifier si l'un des fichiers ou des fichiers zip imbriqués a des extensions de fichiers ce que je ne suis pas permettre. C'est pour m'assurer que je peux empêcher mes utilisateurs de télécharger des fichiers interdits même lorsqu'ils les zippent. J'ai également la possibilité d'utiliser Tika qui peut faire une analyse récursive (en utilisant la solution de Zukka Zitting), mais je ne sais pas si je peux utiliser les métadonnées pour faire cette détection comme je le souhaite.

Toute aide/suggestion est appréciée.

Author: ha9u63ar, 2016-02-11

1 answers

Utiliser Commons Compress serait plus facile, notamment parce qu'il a des interfaces partagées sensibles entre les différents décompresseurs qui facilitent la vie + permet de gérer d'autres formats de compression (par exemple Tar) en même temps

Si vous souhaitez utiliser uniquement le support Zip intégré, je vous suggère de faire quelque chose comme ceci:

File file = new File("outermost.zip");
FileInputStream input = new FileInputStream(file);
check(input, file.toString());

public static void check(InputStream compressedInput, String name) {
   ZipInputStream input = new ZipInputStream(compressedInput);
   ZipEntry entry = null;
   while ( (entry = input.getNextEntry()) != null ) {
      System.out.println("Found " + entry.getName() + " in " + name);
      if (entry.getName().endsWith(".zip")) { // TODO Better checking
         check(input, name + "/" + entry.getName());
      }
   }
}

Votre code échouera car vous essayez de lire inner.zip dans outer.zip en tant que fichier local, mais il n'existe pas en tant que fichier autonome. Le code ci-dessus va traiter les choses se terminant par .zip comme un autre fichier zip, et récurse

, Vous voudrez probablement utiliser communes compresser, donc vous pouvez gérer les choses avec d'autres noms de fichiers d'autres formats de compression etc

 2
Author: Gagravarr, 2016-02-11 12:39:50