Загрузка файла PDF с помощью Spring приводит к повреждению файла - PullRequest
0 голосов
/ 09 октября 2019

В Spring реализован контроллер, который записывает содержимое в файл pdf (через поток ввода) в ServletOutputStream, однако при сравнении содержимого существующего файла и загруженного файла он выглядит поврежденным.

 public class DownloadFileController {

    @GetMapping(value = "v0/file")
    @ResponseBody
    public void downloadFile(HttpServletResponse response) {

      try (ServletOutputStream outputStream = response.getOutputStream();
          InputStream inputStream = getFile()) {

        response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);
        response.setHeader(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"example.pdf\"");
        IOUtils.copy(inputStream, outputStream);

      } catch (IOException ex) {
        throw ...
      }
    }

    private static InputStream getFile() {
      return DownloadFileController.class.getResourceAsStream("/example.pdf");
    }
  }

HTTP-запрос успешен и отвечает содержимым PDF, однако он помечен следующим образом:

Редактировать: Файл не всегдабыть PDF, это также могут быть изображения, текстовые документы и т. д.

Ответы [ 3 ]

0 голосов
/ 09 октября 2019

Установите тип контента на application/pdf для загрузки .pdf файлов .

Вы можете использовать этот метод setContentType() для установки типа контента иустановите Content-Disposition в заголовке ответа, используя метод addHeader() из HttpServletResponse class.

Например:

response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=example.pdf");
0 голосов
/ 10 октября 2019

Оказывается, я был идиотом и интерпретировал бинарный ответ как текст, который приводил к неизвестным символам.

0 голосов
/ 09 октября 2019

изменить

response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_OCTET_STREAM_VALUE);

на

response.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_PDF);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...