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]
誰かがこの問題を解決するのを手伝ってくれますか? どうもありがとう。