当前位置: 首页 > 知识库问答 >
问题:

使用ZipOutputStream损坏的zip文件

阎宾实
2023-03-14

我正在尝试创建一个zip文件,以便能够通过http发送多个文件。

我的问题是,生成的Zip文件在发送之前和之后都“损坏”。问题是我无法找到我做错了什么,因为我在控制台中没有收到任何错误。

那么,有人有一个想法文件我生成的zip文件损坏?

这是我的代码:

  OutputStream responseBody = t.getResponseBody();
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ZipOutputStream zos = new ZipOutputStream(baos);


            int counter = 1;
            for (PDDocument doc : documents)
            {
                ZipEntry zipEntry = new ZipEntry("document" + counter);
                zos.putNextEntry(zipEntry);
                ByteArrayOutputStream docOs = new ByteArrayOutputStream();
                doc.save(docOs);
                docOs.close();
                zos.write(docOs.toByteArray());
                zos.closeEntry();
                zos.finish();
                zos.flush();

                counter++;
            }
            zos.close();
            baos.close();


            responseBody.write(baos.toByteArray());
            responseBody.flush();

谢谢你的帮助!

共有1个答案

路金鑫
2023-03-14

当循环终止ZIP条目时,您需要从循环内部删除zos.finish(),因为它由流末尾的zos.close()处理。

有了非常大的流,你最好直接发送ZIP到响应体,绕过字节数组输出流内存缓冲区。

如果仍然存在问题,请检查输出的内容类型是否已设置。通过临时将字节[]写入文件以检查发送的ZIP格式,调试可能会更容易:

Files.write(Path.of("temp.zip"), baos.toByteArray());

下面的大纲显示了通过http发送一个简单的ZIP(从servlet,将前两行调整为适当的“t”调用)。如果在循环中添加自己的文档对象,这可能会帮助您检查代码的哪个步骤导致损坏:

// MUST set response content type:
// resp.setContentType("application/zip");
OutputStream out = resp.getOutputStream(); // or t.getResponseBody();
try(ZipOutputStream zos = new ZipOutputStream(out))
{
    while (counter-- > 0)
    {
        ZipEntry zipEntry = new ZipEntry("document" + counter+".txt");
        zos.putNextEntry(zipEntry);
        zos.write(("This is ZipEntry: "+zipEntry.getName()+"\r\n").getBytes());
    }
}
 类似资料:
  • 我想用Java编写一个GUI zip/unzip程序。该程序将能够压缩文件和目录/IES的任何组合,并解压缩一个或多个压缩文件。 现在我刚刚完成了GUI和zip Funtion。但是zip funtion似乎不能正常工作,产生的zip文件不知何故被破坏了。我找不到问题到底出在哪里。它似乎与函数或函数有关。 当我测试该程序时,输出如下: 归档:找不到test1.zip中央目录结束签名。要么这个文件不

  • 我试图压缩字符串上转换的Xml列表,将它们保存在一个zip文件中,并在restful上作为POST的主体返回。但是每次我保存文件时,都会出现错误“存档格式未知或损坏”。 有人能帮我吗?

  • 我编写的下载文件的方法总是产生损坏的文件。 我通过adb访问这些文件,将它们传输到我的sccard,在那里我看到它们似乎有合适的大小,但没有根据例如Linux命令的类型。 你知道丢失了什么以及如何修复它吗? 谢谢。 代码的简单版本(但错误相同) 日志:< code > file . length:2485394 | content length:1399242 问题是,我从我的API单例中获得了,

  • 问题内容: 我们有一段代码可以在我们的系统上生成一个zip文件。一切正常,但是有时该Zip文件在由FilZip或WinZip打开时被视为已损坏。 所以这是我的问题:我们如何以编程方式检查生成的zip文件是否损坏? 这是我们用于生成zip文件的代码: 我们在这里做错了什么吗? 编辑:实际上,上面的代码是绝对可以的。我的问题是我正在为用户重定向WRONG流。因此,与其打开一个zip文件,不如打开一个完

  • 问题内容: 我使用Eclipse在Windows 7中创建了一个jar文件。当我尝试打开jar文件时,它说jar文件无效或损坏。谁能建议我为什么jar文件无效? 问题答案: 当您在Windows资源管理器中双击一个JAR文件时,会发生这种情况,但是JAR本身实际上不是 可执行的 JAR。真正的可执行JAR至少应具有带有方法的类,并在中引用它。 在Eclispe中,您需要将项目导出为 Runnabl

  • 问题内容: 我编写了一个代码,用于在文件中保存少量图像,然后压缩该文件并上传到ftp服务器。当我从服务器下载该文件时,很少有文件可用,并且很少有文件损坏。可能是什么原因呢?压缩代码或上载程序代码是否有故障。 压缩代码: } FTP上传代码: 问题答案: 确保传输BINARY_FILE_TYPE中的文件。也许返回假? 顺便说一句,如果您以ASCII模式传输zip,几乎肯定会导致损坏。