Неправильные заголовки файлов создаются для заархивированных файлов внутри ответа multipart/form-data.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Неправильные заголовки файлов создаются для заархивированных файлов внутри ответа multipart/form-data.

Сообщение Anonymous »

Я могу успешно загрузить ZIP-файл при использовании возврата ответа как application/octet-stream, но не при использовании multipart/form-data. В загруженном ZIP-файле для каждого файла внутри ZIP ровно 2 байта неверны в соответствующих заголовках файлов.
Пример двоичного вывода ZIP-файлов:
  • Правильное содержимое ZIP при использовании application/octet-stream:
PK�~�Xfirst_file.xml��,V�D���܂�Tg'��ĒDC=PK�T�CPK�~�Xsecond_file.xml��,V�D���܂�Tg'��ĒD#=PK�hPK�~�Xthird_file.xml��,V�D���܂�Tg'��ĒDc=PKW6�qPK�~�X�T�Cfirst_file.xmlPK�~�X�hYsecond_file.xmlPK�~�XW6�q�third_file.xmlPK�
  • Неверное содержимое ZIP при использовании multipart/form-data:
PK��Xfirst_file.xml��,V�D���܂�Tg'��ĒDC=PK�T�CPK��Xsecond_file.xml��,V�D���܂�Tg'��ĒD#=PK�hPK��Xthird_file.xml��,V�D���܂�Tg'��ĒDc=PKW6�qPK��X�T�Cfirst_file.xmlPK��X�hYsecond_file.xmlPK��XW6�q�third_file.xmlPK�

Различия в заголовках:
Первоначальные байты заголовка для каждого из трех файлов внутри 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»