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

使用Zip4j生成Zip以供下载

全兴运
2023-03-14

我尝试使用Zip4j生成一个zip文件供下载。但我总是得到错误:

public void EmployeeEncyrptedZipFileDownload(HttpServletResponse response, @RequestParam(value = "id", required = true) int employeeId) throws IOException, ZipException
{
    //Prepare text file contents
    String fileContent = "Hallo Welt";

    response.setContentType("application/zip");
    response.setHeader("Content-Disposition", "attachment;filename=test.zip");

    final StringBuilder sb = new StringBuilder(fileContent);
    final ZipOutputStream zout = new ZipOutputStream(response.getOutputStream());

    File file = new File("mytext.txt");
    zout.putNextEntry(file, null);
    byte[] data = sb.toString().getBytes();
    zout.write(data, 0, data.length);

    zout.closeEntry();
    zout.finish();
}

共有1个答案

程祯
2023-03-14

那是因为,这条线

zout.putNextEntry(file, null);

由于参数为null而引发一个null指针。而且,由于我没有看到servlet的其余部分,我猜测servlet可能正在尝试再次获取outputstream来处理/抛出这个异常。

上述putNextEntry()调用中的第二个参数是zipParameters。正如名称所描述的,这个参数指定各种zip参数,例如,如果zip是密码保护的,或者zip的内容是从文件或输入流中读取的,等等。这是一个必需的参数。

这个调用的第一个参数是File对象。只有在从本地文件流构建zip时才需要这样做。如果您正在从外部流构建一个zip(例如在您的案例中),则该参数可以为NULL。我知道这不是一个好的设计,将在即将发布的版本中修复。

您的方案的修复程序是:

public void EmployeeEncyrptedZipFileDownload(HttpServletResponse response, @RequestParam(value = "id", required = true) int employeeId) throws IOException, ZipException
{
    //Prepare text file contents
    String fileContent = "Hallo Welt";

    response.setContentType("application/zip");
    response.setHeader("Content-Disposition", "attachment;filename=test.zip");

    final StringBuilder sb = new StringBuilder(fileContent);
    final ZipOutputStream zout = new ZipOutputStream(response.getOutputStream());

    ZipParameters zipParameters = new ZipParameters();
    zipParameters.setSourceExternalStream(true);
    zipParameters.setFileNameInZip("mytext.txt");

    zout.putNextEntry(null, zipParameters);
    byte[] data = sb.toString().getBytes();
    zout.write(data, 0, data.length);

    zout.closeEntry();
    zout.finish();
}
 类似资料:
  • 问题内容: 我想创建受密码保护的ZIP: 但这只是加密zip中的文件,但我可以打开此zip并查看其中的文件 问题答案: 由于专利问题,Zip4j不支持文件列表的加密。 参见:http : //www.lingala.net/zip4j/forum/index.php?topic=104.0 更新: 如链接中所述。zip规范不包括文件列表的加密。要隐藏文件名,您可以创建一个zip文件,其中包含您的文

  • 问题内容: 是否可以制作一个zip存档并提供下载,但仍不将文件保存到硬盘驱动器? 问题答案: 要触发下载,你需要设置标题: 如果你不想将文件放在磁盘上,则需要使用 你也可以选择设置标头:

  • 我正在使用java创建一个zip文件,但我无法得到任何代码工作。我尝试了很多特定于Java7和Java8的方法,但所有的方法都显示出某种错误,是我的代码中有错误还是需要改进? 在这一行出现错误 请指导我:) 运行时出错:

  • 问题内容: 如何在Django中为用户提供动态生成的ZIP存档? 我正在建立一个站点,用户可以在其中选择可用书籍的任意组合,并将其下载为ZIP存档。我担心为每个请求生成这样的存档会降低我的服务器的爬网速度。我还听说Django当前没有很好的解决方案来提供动态生成的文件。 问题答案: 解决方法如下。 使用Python模块zipfile创建zip存档,但是在文件中指定StringIO对象(ZipFil

  • 问题内容: 我正在尝试使用密码保护解压缩zip文件。我知道有一个名为“ zip4j”的Java库可以为我提供帮助。但是我无法打开zip4j网站来查看教程。 我已经用另一个镜像下载了zip4j库,但是我不知道如何使用它。有没有人可以粘贴使用zip4j解压缩密码保护zip文件的示例代码? zip4j网站 非常感谢! 问题答案: 请尝试以下操作,并确保您使用的是最新的Zip4j库(1.3.1):

  • ZIP4J 是一个开源的 Java 处理 zip 压缩文件的开发包。 主要特性: Create, Add, Extract, Update, Remove files from a Zip file Read/Write password protected Zip files Supports AES 128/256 Encryption Supports Standard Zip Encryp