在应用程序服务器上存储PDF文件并限时提供下载

5

嗨,我正在使用PrimeFaces 5 / JSF 2和Tomcat!

有人可以向我展示或给我一个关于如何在应用服务器上存储PDF文件并在一定时间后下载它(如果用户需要)的想法吗?这个功能涉及到发票,所以我不能使用dataExporter。

更具体地说,我基本上已经实现了这一点,但我不太确定。一个大问题是......我在哪里存储我的生成文件?我浏览了一下,人们说不能将文件保存在webApp或tomcat目录中。我还有什么其他解决方案?

2个回答

4

利用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());

另请参阅:


只是一个观察,这行代码: String tempDir = (String) getServletContext().getAttribute(ServletContext.TEMPDIR); 会抛出 ClassCastException 异常,因为它返回的是一个文件而不是字符串。 - lboullo0

0

你的问题比较模糊,但如果我的理解是正确的:

首先,如果你想要在有限的时间内存储PDF文件,你可以创建一个任务来每天或每周清理你的PDF文件,或者根据你的需要进行清理。

对于下载方面,你可以使用<p:fileDownload>http://www.primefaces.org/showcase/ui/file/download.xhtml)从应用服务器下载任何文件。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接