有一个半损坏的 zip-archive 可以从中提取,但会提供一个半损坏的文件。
Ubuntu Archive Manager 从存档中提取,但给出警告:
以下 Java 代码完全没有错误:
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipFile;
import org.apache.commons.io.IOUtils;
...
public static boolean isValidZipFile(final File file) {
if (file.length() == 0) return false;
try (ZipFile zipFile = new ZipFile(file)) {
final Enumeration<ZipArchiveEntry> entries = zipFile.getEntries();
while (entries.hasMoreElements()) {
ZipArchiveEntry entry = entries.nextElement();
if (entry.getName().endsWith(".txt")) {
final InputStream is = zipFile.getInputStream(entry);
byte[] bytes = IOUtils.toByteArray(is);
return true;
}
}
} catch (IOException e) {
return false;
}
return false;
}
依赖项:
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.7</version>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-compress</artifactId>
<version>1.20</version>
</dependency>
NB档案的内容是一个单一的文本文件(这是事先同意的)。
Q.如何严格验证 zip 文件,使其在这种情况下被视为无效?
PS可以使用 apache-commons-compress 以外的其他库重写代码。最终目标是验证可靠性。