从弹簧控制器下载文件

新手上路,请多包涵

我有一个要求,我需要从网站下载 PDF。 PDF需要在代码中生成,我认为这将是freemarker和iText等PDF生成框架的组合。有更好的办法吗?

但是,我的主要问题是如何允许用户通过 Spring Controller 下载文件?

原文由 MilindaD 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 475
2 个回答
@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
public void getFile(
    @PathVariable("file_name") String fileName,
    HttpServletResponse response) {
    try {
      // get your file as InputStream
      InputStream is = ...;
      // copy it to response's OutputStream
      org.apache.commons.io.IOUtils.copy(is, response.getOutputStream());
      response.flushBuffer();
    } catch (IOException ex) {
      log.info("Error writing file to output stream. Filename was '{}'", fileName, ex);
      throw new RuntimeException("IOError writing file to output stream");
    }

}

一般来说,当你有 response.getOutputStream() 时,你可以在那里写任何东西。您可以将此输出流作为将生成的 PDF 放入生成器的位置传递。此外,如果您知道要发送的文件类型,您可以设置

response.setContentType("application/pdf");

原文由 Infeligo 发布,翻译遵循 CC BY-SA 3.0 许可协议

我能够通过使用 Spring 中的内置支持及其 ResourceHttpMessageConverter 来简化此操作。如果可以确定 mime 类型,这将设置内容长度和内容类型

@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET)
@ResponseBody
public FileSystemResource getFile(@PathVariable("file_name") String fileName) {
    return new FileSystemResource(myService.getFileFor(fileName));
}

原文由 Scott Carlson 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题