我有一个需要从网站下载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.getOutputStream()
response.setContentType("application/pdf");
通过使用Spring的ResourceHttpMessageConverter中的内置支持,我能够简化这一过程。如果可以确定mime类型,则将设置content-length和content-type
@RequestMapping(value = "/files/{file_name}", method = RequestMethod.GET) @ResponseBody public FileSystemResource getFile(@PathVariable("file_name") String fileName) { return new FileSystemResource(myService.getFileFor(fileName)); }