如何在 rest API 中使用 zip4j 下载压缩文件?

How to download zipped file with zip4j in rest API?

使用 zip4j lib 我可以从包含子文件夹和文件的文件夹创建一个 zip 文件。但是现在我想通过 Rest API 将它下载到客户端,所以我使用 ZipOutputStream 但我不知道如何从生成的 zip 文件中获取 InputStream。

生成zip文件的方法。

public void generateBulkConfigFile(HttpServletResponse response, String root, String zippedFileName) {

    File rootFolder = FileUtil.createRootFolder(root);
    response.setStatus(HttpServletResponse.SC_OK);
    response.addHeader("Content-Disposition", "attachment; filename=\"" + "test.zip" + "\"");

    ZipParameters zipParameters = new ZipParameters();
    zipParameters.setEncryptFiles(true);
    zipParameters.setEncryptionMethod(Zip4jConstants.ENC_METHOD_STANDARD);
    zipParameters.setPassword("1234");

    //Code to process data, write files and subfolders to root folder

    try {
        ZipFile zipFile = new ZipFile(rootFolder.getAbsolutePath() +  System.lineSeparator() + zippedFileName + ".zip");
        zipFile.addFolder(rootFolder, zipParameters);

        //Todo: get inputstream from zipped file and write to response outputstream for client

    } catch (ZipException e) {
        log.error("Error: ", e);
        throw e;
    } catch (IOException e) {
        log.error("Error: ", e);
        throw e;
    }
}

以上代码成功在所需文件夹中创建了 zip 文件。我尝试添加这行代码以输出响应。

ZipOutputStream zipOutputStream = new ZipOutputStream(response.getOutputStream());
FileInputStream fileInputStream = new FileInputStream(zipFile.getFile());
IOUtils.copy(fileInputStream, zipOutputStream);

fileInputStream.close();
zipOutputStream.finish();
zipOutputStream.close();

但是在IOUtils class的复制方法中以NullPointerException结尾。

java.lang.NullPointerException: null
at net.lingala.zip4j.io.DeflaterOutputStream.write(DeflaterOutputStream.java:89) ~[zip4j-1.3.3.jar:?]
at net.lingala.zip4j.io.ZipOutputStream.write(ZipOutputStream.java:31) ~[zip4j-1.3.3.jar:?]
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1793) ~[commons-io-2.4.jar:2.4]
at org.apache.commons.io.IOUtils.copyLarge(IOUtils.java:1769) ~[commons-io-2.4.jar:2.4]
at org.apache.commons.io.IOUtils.copy(IOUtils.java:1744) ~[commons-io-2.4.jar:2.4]

有人可以帮我解决这个问题吗?非常感谢。

怎么样

try (Outpustream os = response.getOutputStream(); 
     InputStream fis = new FileInputStream(zipFile.getFile())) {
    IOUtils.copy(fis, os);
}

您不需要将输出流包装在 ZipOutputStream 中,因为您输入的字节已经压缩。由另一端的客户端消耗这些字节并将它们膨胀回来。