存档已损坏/警告“标头错误”...但一切正常? (zip64)

问题描述 投票:0回答:2

我正在压缩(使用 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?

java servlets zip response-headers zipoutputstream
2个回答
0
投票

通过将

zos.setUseZip64(Zip64Mode.Always);
更改为
zos.setUseZip64(Zip64Mode.AsNeeded);

解决了这个问题

0
投票
zout.setUseZip64(Zip64Mode.AlwaysWithCompatibility);

对我有用。

© www.soinside.com 2019 - 2024. All rights reserved.