Запись XML-файлов в zip-файл с помощью ZipOutputStream - ошибка при открытии
РЕДАКТИРОВАТЬ: ошибка не была в этом коде. Загрузка на переднем конце была ошибочной. Почтовый индекс на сервере был в порядке, но загрузка через JS не работала.
Я пишу два XML-файла в ZIP-файл. Я не могу открыть полученный файл (ошибка: нет файла и нет папки).
Tuple - это класс, который содержит две строки (A и B), мой xml-контент. Я сначала попробовал это без 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();
}
}
1 ответ
Я считаю, что ошибка не в этом методе. Следующий фрагмент кода, основанный на опубликованном вами коде, создает действительный 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
Вы должны указать кодировку, чтобы убедиться, что содержимое файла не искажено.