在应用服务器上限制存储PDF并使其可供下载

时间:2014-08-21 15:51:04

标签: jsf tomcat pdf primefaces download

Hei那里,我正在使用PrimeFaces 5 / JSF 2和tomcat!

有人可以告诉我或者让我知道如何在应用程序服务器上有限时间存储pdf(我正在使用tomcat)然后下载它(如果这是用户请求的)。此功能与发票相关,因此我无法使用dataExporter。

更具体一点,我几乎实现了这一点,但我对此并不十分肯定。一个大问题是......我在哪里存储生成的文件?我浏览过,人们说将文件保存在webApp或tomcat目录中是不行的。我还有什么其他的解决方案?

2 个答案:

答案 0 :(得分:4)

利用File#createTempFile()设施。 servletcontainer管理的临时文件夹可用作应用程序作用域属性,并以ServletContext.TEMPDIR为密钥。

String tempDir = (String) externalContext.getApplicationMap().get(ServletContext.TEMPDIR);
File tempPdfFile = File.createTempFile("generated-", ".pdf", tempDir);
// Write to it.

然后将自动生成的文件名传递给负责提供它的人。 E.g。

String tempPdfFileName = tempPdfFile.getName();
// ...

最后,一旦负责提供服务的人使用文件名作为参数调用,例如a simple 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());

另见:

答案 1 :(得分:0)

你的问题很模糊,但如果我的理解很好:

首先,如果您想在有限的时间内存储PDF,您可以创建一个每天或每周清理PDF的作业或任何您需要的作业。

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