EDIT: Der Fehler war nicht in diesem Code. Der Download auf dem Frontend war fehlerhaft. Die Zip auf dem Server war in Ordnung, aber das Herunterladen über js hat nicht funktioniert.Schreiben von XML-Dateien in Zip-Datei mit ZipOutputStream - Fehler beim Öffnen
Ich schreibe zwei XML-Dateien in eine Zip-Datei. Ich kann die resultierende Datei nicht öffnen (Fehler: keine Datei und kein Ordner).
Tuple ist eine Klasse, die zwei Strings (A und B) enthält, mein xml-Inhalt. Ich habe das zuerst ohne closeEntry
und ohne setSize
versucht, das Ergebnis ist das gleiche.
Irgendwelche Ideen? Wie kann ich das debuggen?
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();
}
}
Wo ist der Code zum Schreiben Ihres 'OutputStream' in Datei? – user2004685
Abgesehen von allem anderen rufen Sie 'String.getBytes()' ohne Angabe der Codierung auf. Tun Sie das nicht - * immer * spezifizieren Sie die Kodierung. Sie rufen auch 'getBytes()' mehrmals auf - einmal, um die Länge zu erhalten, und dann wieder, um sie zu schreiben. Ich würde es einmal pro Eintrag aufrufen und das Ergebnis in einem 'byte []' speichern. Vielleicht möchten Sie diese Logik in eine Methode extrahieren, 'writeStringAsZipEntry' oder etwas ähnliches ... –
Das Schreiben wird von Apache Camel gemacht. Dies funktioniert mit anderen Dateien, daher ist es hier nicht enthalten. Der Aufruf getBytes wird immer noch zweimal verwendet, weil ich die Größe nicht zuerst angegeben habe. Ist das überhaupt nötig? –