嗨,我正在使用PrimeFaces 5 / JSF 2和Tomcat!
有人可以向我展示或给我一个关于如何在应用服务器上存储PDF文件并在一定时间后下载它(如果用户需要)的想法吗?这个功能涉及到发票,所以我不能使用dataExporter。
更具体地说,我基本上已经实现了这一点,但我不太确定。一个大问题是......我在哪里存储我的生成文件?我浏览了一下,人们说不能将文件保存在webApp或tomcat目录中。我还有什么其他解决方案?
嗨,我正在使用PrimeFaces 5 / JSF 2和Tomcat!
有人可以向我展示或给我一个关于如何在应用服务器上存储PDF文件并在一定时间后下载它(如果用户需要)的想法吗?这个功能涉及到发票,所以我不能使用dataExporter。
更具体地说,我基本上已经实现了这一点,但我不太确定。一个大问题是......我在哪里存储我的生成文件?我浏览了一下,人们说不能将文件保存在webApp或tomcat目录中。我还有什么其他解决方案?
利用File#createTempFile()
工具。Servlet容器管理的临时文件夹可作为应用程序范围属性使用,键名为ServletContext.TEMPDIR
。
String tempDir = (String) externalContext.getApplicationMap().get(ServletContext.TEMPDIR);
File tempPdfFile = File.createTempFile("generated-", ".pdf", tempDir);
// Write to it.
然后将自动生成的文件名传递给负责提供服务的人。例如:
String tempPdfFileName = tempPdfFile.getName();
// ...
最后,一旦负责提供服务的人以文件名为参数进行调用,例如一个简单的servlet,然后只需按照以下方式流式传输它:
String tempDir = (String) getServletContext().getAttribute(ServletContext.TEMPDIR);
File tempPdfFile = new File(tempDir, tempPdfFileName);
response.setHeader("Content-Type", "application/pdf");
response.setHeader("Content-Length", String.valueOf(tempPdfFile.length()));
response.setHeader("Content-Disposition", "inline; filename=\"generated.pdf\"");
Files.copy(tempPdfFile.toPath(), response.getOutputStream());
你的问题比较模糊,但如果我的理解是正确的:
首先,如果你想要在有限的时间内存储PDF文件,你可以创建一个任务来每天或每周清理你的PDF文件,或者根据你的需要进行清理。
对于下载方面,你可以使用<p:fileDownload>
(http://www.primefaces.org/showcase/ui/file/download.xhtml)从应用服务器下载任何文件。
String tempDir = (String) getServletContext().getAttribute(ServletContext.TEMPDIR);
会抛出 ClassCastException 异常,因为它返回的是一个文件而不是字符串。 - lboullo0