0

使用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();

但它最终以类NullPointerException的复制方法结束IOUtils

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]

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

4

1 回答 1

1

刚刚怎么样

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

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

于 2019-08-19T06:55:23.077 回答