Как создать ZIP-файл для списка «виртуальных файлов» и вывести на httpservletresponse - PullRequest
6 голосов
/ 14 января 2011

Моя цель - поместить несколько объектов java.io.File в zip-файл и распечатать их для загрузки в HttpServletResponse.

Файлы были созданы маршаллером JAXB. Это объект java.io.File, но на самом деле он не находится в файловой системе (он только в памяти), поэтому я не могу создать FileInputStream.

Все ресурсы, которые я видел, используют OutputStream для печати содержимого zip-файла. Но все эти ресурсы используют FileInputStream (который я не могу использовать).

Кто-нибудь знает, как мне это сделать?

Ответы [ 2 ]

6 голосов
/ 14 января 2011

Взгляните на библиотеку Apache Commons Compress , она обеспечивает необходимую вам функциональность.

Конечно, «Эриксон» прав в своем комментарии к вашему вопросу.Вам понадобится содержимое файла, а не объект java.io.File.В моем примере я предполагаю, что у вас есть метод byte[] getTheContentFormSomewhere(int fileNummer), который возвращает содержимое файла (в памяти) для файла fileNummer-й.- Конечно, эта функция плохого дизайна, но она только для иллюстрации.

Она должна работать примерно так:

void compress(final OutputStream out) {
  ZipOutputStream zipOutputStream = new ZipOutputStream(out);
  zipOutputStream.setLevel(ZipOutputStream.STORED);

  for(int i = 0; i < 10; i++) {
     //of course you need the file content of the i-th file
     byte[] oneFileContent = getTheContentFormSomewhere(i);
     addOneFileToZipArchive(zipOutputStream, "file"+i+"."txt", oneFileContent);
  }

  zipOutputStream.close();
}

void addOneFileToZipArchive(final ZipOutputStream zipStream,
          String fileName,
          byte[] content) {
    ZipArchiveEntry zipEntry = new ZipArchiveEntry(fileName);
    zipStream.putNextEntry(zipEntry);
    zipStream.write(pdfBytes);
    zipStream.closeEntry();
}

Фрагменты вашего http-контроллера:

HttpServletResponse response
...
  response.setContentType("application/zip");
  response.addHeader("Content-Disposition", "attachment; filename=\"compress.zip\"");
  response.addHeader("Content-Transfer-Encoding", "binary");
  ByteArrayOutputStream outputBuffer = new ByteArrayOutputStream();
  compress(outputBuffer);
  response.getOutputStream().write(outputBuffer.toByteArray());
  response.getOutputStream().flush();
  outputBuffer.close();
3 голосов
/ 14 января 2011

Оказывается, я идиот :) "Создаваемый" файл сохранялся по неверному пути и глотал исключение, поэтому я подумал, что он "создается", хорошо.Однако когда я попытался создать экземпляр нового FileInputStream, он пожаловался на то, что файл не существует (это правильно).У меня был брейнфарт, и я предположил, что объект java.io.File где-то содержал информацию о файле.Но, как указал Эриксон, это было ложно.

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

...