オラクルがウェブサイトで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 に欠けている機能 (zipout を実行する際の文字設定など) に対応していることを私は知っています。しかし、私が確信していないのは、ネストされた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 のソリューションを使用)、メタデータを使用してこの検出を希望どおりに実行できるかどうかはわかりません。
どんな助け/提案も大歓迎です。