архивирование двоичных данных в Java - PullRequest
4 голосов
/ 08 декабря 2011

Я пытаюсь сжать группу двоичных данных (набор результатов, возвращаемых из базы данных) в один файл. Который можно скачать через веб-приложение. Следующий код используется для сжатия набора результатов и записи файла zip в HttpServletResponse

String outFilename = "outfile.zip";
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment; filename= " + outFilename);
OutputStream os = response.getOutputStream();
ZipOutputStream out = new ZipOutputStream(os);
for (int i = 0; i < cardFileList.size(); i++) {

    CardFile cardFile = cardFileList.get(i);
    out.putNextEntry(new ZipEntry(cardFile.getBinaryFileName()));
    out.write(cardFile.getBinaryFile(), 0, cardFile.getBinaryFile().length);
    out.closeEntry();
}
// Complete the ZIP file
out.flush();
out.close();
os.close();

Проблема в том, что при разархивировании загруженного zip-файла с помощью WinRar я получаю следующую ошибку:

Путь к файлу: многочастный или поврежденный ZIP-архив

Может кто-нибудь указать, где я совершаю ошибку? Любая помощь будет оценена.

[ПРАВИТЬ] Я пытался response.setContentType("application/zip");, но тот же результат.

Ответы [ 2 ]

1 голос
/ 08 декабря 2011

У меня работает следующий код:

FileOutputStream os = new FileOutputStream("out.zip");
ZipOutputStream zos = new ZipOutputStream(os);
try
{
    for (int i = 1; i <= 5; i++)
    {
        ZipEntry curEntry = new ZipEntry("file" + i + ".txt");
        zos.putNextEntry(curEntry);
        zos.write(("Good morning " + i).getBytes("UTF-8"));
    }
}
finally
{
    zos.close();
}

Zip-файлы, созданные с помощью этого кода, без проблем открываются с помощью 7-zip.

  • Убедитесь, что ответ сервлета не является страницей с ошибкой 404 или 500. Выберите небольшой ответ и откройте его с помощью шестнадцатеричного редактора или даже текстового редактора. Zip-файлы начинаются с магического номера PK, который должен быть виден даже в текстовом редакторе.
  • Попробуйте сохранить в файл вместо выходного потока сервлета для начала и посмотрите, имеет ли это значение.
  • Может ли быть фильтр, изменяющий вывод вашего сервлета / портящий ZIP?
0 голосов
/ 08 декабря 2011

Ваш код выглядит правильно для создания файла.Так что проблема, вероятно, в вашей загрузке.

  1. посмотрите на файл, который вы скачали.Какой у него размер?
  2. попробуйте инструмент, отличный от WinRar, и посмотрите, что у вас есть.7Zip приличный.
...