我正在压缩(使用 zip64)多个文件,然后将其返回以响应用户。
response.setContentType("application/zip"); // Doesn't seem like this makes any difference?
response.setHeader("Content-Disposition", "attachment; filename=" + getZipFileName(survey) + ".zip"); // Doesn't seem like this makes any difference?
// Remove caching prevention
response.setHeader("Pragma", "");
response.setHeader("Cache-Control", "");
response.setHeader("Connection", "keep-alive");
ServletOutputStream responseOutputStream = response.getOutputStream();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipArchiveOutputStream zos = new ZipArchiveOutputStream(bos);
zos.setUseZip64(Zip64Mode.Always);
try {
for (RespondentUploadedFile file : filesNotFromDeletedVariables) {
String fileName = buildFileName(file);
ZipArchiveEntry entry = new ZipArchiveEntry(fileName);
zos.putArchiveEntry(entry); // Writes the header for an archive entry to the outputstream
byte[] fileData = file.getRamFile().getData();
zos.write(fileData);
zos.closeArchiveEntry();
}
} catch (Exception e) {
... // We never get in here
} finally {
zos.close();
}
responseOutputStream.write(bos.toByteArray());
responseOutputStream.flush(); // tried adding / removing this ... no difference
} catch (Exception e) {
response.sendError(SC_INTERNAL_SERVER_ERROR); // We never get here
}
如果我只是单击下载的 zip 文件,则不会收到任何错误/警告。
如果我尝试提取 zip 文件,则会收到如下所示的警告:
在提取的文件夹中,一切都很好并且符合预期......那么发生了什么事?我怎样才能摆脱这个警告,以免在没有任何错误的情况下迷惑任何用户。
我认为这可能与
.setContentType
和 .setHeader
有关,但令我惊讶的是,如果我改变这些,行为方面没有区别,正如你在这里看到的:
我怀疑这可能与我正在处理 zip64 有关,但有些东西将其视为只是一个 zip?
通过将
zos.setUseZip64(Zip64Mode.Always);
更改为 zos.setUseZip64(Zip64Mode.AsNeeded);
解决了这个问题
zout.setUseZip64(Zip64Mode.AlwaysWithCompatibility);
对我有用。