コモンズ圧縮を使用して複数のファイルを圧縮し、サーブレットからクライアントに送信しています。ファイルは、任意のタイプのファイル (テキスト、ビデオ、オーディオ、アーカイブ、画像など) の組み合わせである可能性があります。ファイルの inputStream を取得し、IOUtils.copy(is, os) を使用して ServletOutputStream に書き込みます。コードは通常、どのドキュメントの組み合わせでも正常に機能しますが、複数の zip を含むファイルをダウンロードする要求があるとjava.io.IOException: Closed
、結果として、zip のサイズが個々のファイル サイズの合計であっても、作成された zip ファイルが壊れています (I圧縮は使用していません)。
ローカルで zip を作成して、コンストラクターのFileOutputStream
代わりに使用しようとしましたが、成功しました。したがって、問題は に存在するようです。response.getOutputStream()
ZipArchiveOutputStream
ServletOutputStream
誰でも回避策を提案できますか。
これが私のコードです:
`try (ZipArchiveOutputStream zos = new ZipArchiveOutputStream( response.getOutputStream())) {
//get fileList
for(File file : files) {
addFileToZip(zos, file.getName(), new BufferedInputStream(new FileInputStream(file)));
}
zos.close()
}
`
public static void addFileToZip(ZipArchiveOutputStream zipOutputStream, String filename, InputStream inputStream) throws FileNotFoundException {
if(zipOutputStream != null && inputStream != null) {
try {
zipOutputStream.putArchiveEntry(new ZipArchiveEntry(filename));
IOUtils.copy(inputStream, zipOutputStream);
logger.debug("fileAddedToZip :" + filename);
} catch (IOException e) {
logger.error("Error in adding file :" + filename, e);
} finally {
try {
inputStream.close();
zipOutputStream.closeArchiveEntry(); //**Starts to fail here after 1st zip is added**
} catch (IOException e) {
logger.error("Error in closing zip entry :" + filename, e);
}
}
}
`
例外トレースは次のとおりです。
java.io.IOException: Closed
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:627)
at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:577)
at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.writeOut(ZipArchiveOutputStream.java:1287)
at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.writeOut(ZipArchiveOutputStream.java:1272)
at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.writeDataDescriptor(ZipArchiveOutputStream.java:997)
at org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream.closeArchiveEntry(ZipArchiveOutputStream.java:461)
at xxx.yyy.zzz.util.ZipUtils.addFileToZip(ZipUtils.java:110)
110行目はzipOutputStream.closeArchiveEntry(); //**Starts to fail here after 1st zip is added**
前もって感謝します。