从弹簧控制器下载文件
我有一个要求,我需要从网站下载PDF。 PDF需要在代码中生成,我认为这是Freemarker和iText等PDF生成框架的结合。 有更好的方法吗?
但是,我的主要问题是如何让用户通过Spring Controller下载文件?
@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");
通过使用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));
}
您应该能够直接在响应中写入文件。 就像是
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename="somefile.pdf"");
然后将该文件作为二进制流写入response.getOutputStream()
。 记得在最后做response.flush()
,应该这样做。