使用Spring下载PDF文件会导致文件损坏

时间:2019-10-09 14:54:57

标签: spring spring-mvc

我在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,也可以是图像,Word文档等。

3 个答案:

答案 0 :(得分:0)

更改

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

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

答案 1 :(得分:0)

将内容类型设置为 application/pdf 以下载.pdf文件

您可以使用setContentType()类中的addHeader()方法,使用此HttpServletResponse方法设置内容类型并在响应标头中设置 Content-Disposition

例如:

response.setContentType("application/pdf");
response.addHeader("Content-Disposition", "attachment; filename=example.pdf");

答案 2 :(得分:0)

结果是我是个白痴,将二进制响应解释为导致未知字符的文本。