2016-03-30 21 views
0

編集:このコードにはエラーはありませんでした。フロントエンドでのダウンロードに誤りがありました。サーバー上のzipは問題ありませんでしたが、js経由でダウンロードしても機能しませんでした。ZipOutputStreamでzipファイルにxmlファイルを書き込む - 開くときにエラーが発生する

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

タプルは、私の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(); 
    } 
} 
+2

ファイルに 'OutputStream'を書き込むコードはどこですか? – user2004685

+2

他のものとは別に、エンコーディングを指定せずに 'String.getBytes()'を呼び出しています。しないでください - *常に*エンコーディングを指定してください。また、 'getBytes()'を複数回呼び出すこともあります.1回は長さを取得し、もう一度それらを書きます。私はエントリごとに一度呼び出すと、結果を 'byte []'に保存します。そのロジックをメソッド 'writeStringAsZipEntry'などに抽出したいかもしれません。 –

+0

書き込みはApache Camelによって行われます。これは他のファイルでも使えるので、ここには含まれていません。最初にサイズを指定しなかったので、getBytes呼び出しは2回使用されます。それは必要なのでしょうか? –

答えて

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()); 
} 

Jon Skeetが、それはおそらくbody.getA()に近い関連で述べたようにアーカイブ

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 

をご確認ください。このメソッドがStringを返す場合は、ファイルの内容が正しく文字化けしていないことを確認するためにエンコーディングを指定する必要があります。

関連する問題