0

zipファイルを作成するために使用しているコードは次のとおりです。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
ZipOutputStream out = new ZipOutputStream(baos);
try {
    for(int i=0; i<docId.length; i++){
        BoxDotComDocumentManager docman = new BoxDotComDocumentManager();
        Document d = docman.get(docId[i]);
        ZipEntry entry = new ZipEntry(d.getFileName());
        entry.setSize(d.getFileBytes().length);
        out.putNextEntry(entry);
        out.write(d.getFileBytes());
        resp.setContentType("application/zip");
        resp.setHeader("Content-Disposition", "attachment; filename="+ "zipdemo.zip"); 
        out.closeEntry();
 }
 } catch (Exception e) {
      System.out.println("E = " + e);
 }
 try {
       resp.getOutputStream().write(baos.toByteArray());
   resp.flushBuffer();
} catch (IOException e) {
   e.printStackTrace();
    }
 finally {
baos.close();
out.close();
 }

zip ファイルはブラウザに返されてダウンロードされますが、ファイルをダウンロードしようとすると、zip ファイルが無効であるためファイルをダウンロードできないというエラーが表示されます。

ドキュメントは、実際のファイルを含むファイルに関するすべての情報を含むオブジェクトです。

私が間違っていることについてのアイデアはありますか?私はこれの多くの順列を試しましたが、どれもうまくいかないようです。前もって感謝します。

キース

4

1 に答える 1

2

3 つの引数で out.write メソッドを使用してみてください。

交換: out.write(d.getFileBytes());

と: out.write(d.getFileBytes(),0,d.getFileBytes().length);


注: Java doc によると、1 つのパラメータを持つ write メソッドは読み取られません。

この出力ストリームに b.length バイトを書き込みます。

FilterOutputStream の書き込みメソッドは、引数 b、0、および b.length を持つ 3 つの引数の書き込みメソッドを呼び出します。

このメソッドは、単一の引数 b を使用して、基になるストリームの引数が 1 つの書き込みメソッドを呼び出さないことに注意してください。

自分のコードでこの変更を行うと、問題が解決しました。

于 2012-03-23T17:28:35.893 に答える