我知道 Oracle在其网站上注明了 ZIP/GZIP 文件压缩器/解压缩器方法。但是我有一个场景,我需要扫描并找出是否涉及任何嵌套的 ZIP/RAR。例如以下情况:
-MyFiles.zip
-MyNestedFiles.zip
-MyMoreNestedFiles.zip
-MoreProbably.zip
-Other_non_zips
-Other_non_zips
-Other_non_zips
我知道 apache commons compress 包和 java.util.zip 是广泛使用的包,commons compress 实际上迎合了 java.util.zip 中缺少的功能,例如在进行 zipouts 时的一些字符设置。但是我不确定的是用于通过嵌套 zip 文件递归的实用程序,并且 SO 上提供的答案并不是这样做的很好的例子。我尝试了以下代码(我从 Oracle 博客获得),但正如我所怀疑的,嵌套目录递归失败,因为它根本找不到文件:
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();
}
}
可能是我做错了什么——或者使用了错误的工具。我的目标是确定是否有任何文件或嵌套的 zip 文件具有我不允许的文件扩展名。这是为了确保我可以阻止我的用户上传被禁止的文件,即使他们正在压缩文件。我还可以选择使用可以进行递归解析的 Tika(使用 Zukka Zitting 的解决方案),但我不确定是否可以使用元数据来按我的意愿进行检测。
任何帮助/建议表示赞赏。