2

コモンズ圧縮を使用して複数のファイルを圧縮し、サーブレットからクライアントに送信しています。ファイルは、任意のタイプのファイル (テキスト、ビデオ、オーディオ、アーカイブ、画像など) の組み合わせである可能性があります。ファイルの inputStream を取得し、IOUtils.copy(is, os) を使用して ServletOutputStream に書き込みます。コードは通常、どのドキュメントの組み合わせでも正常に機能しますが、複数の zip を含むファイルをダウンロードする要求があるとjava.io.IOException: Closed 、結果として、zip のサイズが個々のファイル サイズの合計であっても、作成された zip ファイルが壊れています (I圧縮は使用していません)。

ローカルで zip を作成して、コンストラクターのFileOutputStream代わりに使用しようとしましたが、成功しました。したがって、問題は に存在するようです。response.getOutputStream()ZipArchiveOutputStreamServletOutputStream

誰でも回避策を提案できますか。

これが私のコードです:

`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**

前もって感謝します。

4

1 に答える 1