Как мне вернуть zip-файл в браузер через ответ OutputStream? - PullRequest
5 голосов
/ 11 января 2012

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

File[] zippable = new File[files.size()];
File resultFile = ZipCreator.zip(files.toArray(zippable), results);
InputStream result = new FileInputStream(resultFile);
IOUtils.copy(result, response.getOutputStream());

Однако в настоящее время это работает не совсем правильно.Вместо того, чтобы возвращать созданный мной zip-файл, он возвращает html-файл.Если я потом вручную изменю расширение файла, то увижу, что содержимое файла - это все еще результаты поиска, которые мне нужны.Таким образом, проблема заключается только в том, чтобы вернуть правильное расширение ответа.

У кого-нибудь есть какой-либо совет для этой ситуации?

Ответы [ 3 ]

7 голосов
/ 11 января 2012

Для заголовка ответа Content-Type необходимо установить значение application/zip (или application/octet-stream, в зависимости от целевого браузера).Кроме того, вы можете отправить дополнительные заголовки ответа с указанием статуса вложения и имени файла.

1 голос
/ 11 января 2012

Вам необходимо установить заголовок типа контента на application/octet-stream перед потоковой передачей результатов.Зависит от того, какую реализацию response вы используете, от того, как вы на самом деле это делаете.

0 голосов
/ 15 мая 2018

Вот некоторый рабочий код, на тот случай, если он кому-нибудь понадобится:

protected void doGet(HttpServletRequest request, HttpServletResponse response) {

        // The zip file you want to download
        File zipFile = new File(zipsResourcesPath + zipFileName);

        response.setContentType("application/zip");
        response.addHeader("Content-Disposition", "attachment; filename=" + zipFileName);
        response.setContentLength((int) zipFile.length());

        try {

            FileInputStream fileInputStream = new FileInputStream(zipFile);
            OutputStream responseOutputStream = response.getOutputStream();
            int bytes;
            while ((bytes = fileInputStream.read()) != -1) {
                responseOutputStream.write(bytes);
            }
        } catch (IOException e) {
            logger.error("Exception: " + e);
        }
}

И HTML:

<a class="btn" href="/path_to_servlet" target="_blank">Download zip</a>

Надеюсь, это поможет!

...