Пример двоичного вывода ZIP-файлов:
- Правильное содержимое ZIP при использовании application/octet-stream:
- Неверное содержимое ZIP при использовании multipart/form-data:
Различия в заголовках:
Первоначальные байты заголовка для каждого из трех файлов внутри ZIP — PK��< /code> (отображается неправильно, большинство символов не отображаются), которые являются подписями и заголовками ZIP-файлов. Байты, которые отличаются (�~ и �) являются частью заголовков локальных файлов в спецификации ZIP, а именно байтами, представляющими такую информацию, как время модификации, CRC-32, сжатый размер и несжатый размер. Поскольку эти байты повреждены, инструмент ZIP не распознает файлы должным образом.
Минимальный код для воссоздания поврежденной версии:
try {
ResultSet rs = ...; // Here we properly set `rs`.
MultipartFormDataOutput multipartOutput = new MultipartFormDataOutput();
ByteArrayOutputStream zipByteOutputStream = new ByteArrayOutputStream();
zipOutputStream = new ZipOutputStream(zipByteOutputStream);
while (rs.next()) {
Clob fileClob = rs.getClob("fileContent");
ByteArrayOutputStream fileByteOutputStream = new ByteArrayOutputStream();
// ... Here we properly fill `fileByteOutputStream`.
ZipEntry entry = new ZipEntry("file.txt");
zipOutputStream.putNextEntry(entry);
zipOutputStream.write(fileByteOutputStream.toByteArray());
zipOutputStream.closeEntry();
}
zipOutputStream.close();
zipByteOutputStream.flush();
InputStream zipInputStream =
new ByteArrayInputStream(zipByteOutputStream.toByteArray());
multipartOutput.addFormData(
"file", zipInputStream, MediaType.valueOf("application/zip"), "zippedFiles.zip");
return Response.ok(multipartOutput).build();
} catch (IOException e) {
e.printStackTrace();
return Response.serverError().build();
} finally {
if (zipOutputStream != null) {
try {
zipOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/785 ... a-response
Мобильная версия