使用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]
有人可以帮我解决这个问题吗?非常感谢。