0

編集: エラーはこのコードにはありませんでした。フロントエンドでのダウンロードに誤りがありました。サーバー上のzipは問題ありませんでしたが、js経由でダウンロードできませんでした。

2 つの xml ファイルを zip ファイルに書き込んでいます。結果のファイルを開くことができません (エラー: ファイルもフォルダーもありません)。

Tuple は、私の xml コンテンツである 2 つの文字列 (A と B) を含むクラスです。closeEntry私は最初に なしとなしでこれを試しましsetSizeたが、結果は同じです。

何か案は?どうすればこれをデバッグできますか?

private static byte[] createArchive(final Tuple<String, String> body) throws IOException {

    try (final ByteArrayOutputStream bos = new ByteArrayOutputStream();
         final ZipOutputStream zos = new ZipOutputStream(bos)) {

        final ZipEntry firstEntry = new ZipEntry("first.xml");
        firstEntry.setSize(body.getA().getBytes().length);
        zos.putNextEntry(firstEntry);
        zos.write(body.getA().getBytes());
        zos.closeEntry();

        final ZipEntry secondEntry = new ZipEntry("second.xml");
        secondEntry.setSize(body.getB().getBytes().length);
        zos.putNextEntry(secondEntry);
        zos.write(body.getB().getBytes());
        zos.closeEntry();

        zos.close();

        return bos.toByteArray();
    }
}
4

1 に答える 1

0

エラーはこのメソッドにはないと思います。投稿されたコードに基づく次のスニペットは、有効な ZIP アーカイブを作成します。

try (ByteArrayOutputStream bos = new ByteArrayOutputStream();
        ZipOutputStream zos = new ZipOutputStream(bos)) {

    byte[] fileA = Files.readAllBytes(Paths.get("/tmp/fileA.xml"));
    byte[] fileB = Files.readAllBytes(Paths.get("/tmp/fileB.xml"));
    ZipEntry firstEntry = new ZipEntry("first.xml");
    firstEntry.setSize(fileA.length);
    zos.putNextEntry(firstEntry);
    zos.write(fileA);
    zos.closeEntry();

    ZipEntry secondEntry = new ZipEntry("second.xml");
    secondEntry.setSize(fileB.length);
    zos.putNextEntry(secondEntry);
    zos.write(fileB);
    zos.closeEntry();
    zos.close();

    Files.write(Paths.get("/tmp/files.zip"), bos.toByteArray());
}

アーカイブをチェック

jar vtf /tmp/files.zip
     5 Wed Mar 30 13:15:02 CEST 2016 first.xml
     5 Wed Mar 30 13:15:02 CEST 2016 second.xml

Jon Skeetが述べたように、おそらくbody.getA(). このメソッドが を返す場合String、ファイルの内容が文字化けしないようにエンコーディングを指定する必要があります。

于 2016-03-30T11:21:22.453 に答える