jsf - 无法访问 tomcat 临时文件夹中的文件

标签 jsf tomcat jsf-2

我正在使用 tomcat 和 java 开发一个 Web 应用程序(报告生成项目)。有些地方我需要创建临时 pdf 文件以将其作为报告预览显示给用户。我正在使用这行代码在临时目录中创建我的临时文件:

 File pdfPath = File.createTempFile("Report",".pdf");

我设法将文件保存到该位置,问题是我无法从我的应用程序中访问该文件以将其显示给用户,我试图通过我的 xhtml 文件中的这一行访问它:

<object type="application/pdf" data="/usr/local/tomcat/temp/Report7990394248362823378.pdf" height="600" width="900"></object>

我做错了什么?正确的做法是什么?

最佳答案

data 属性的值是错误的。它应该代表一个(相对的)HTTP URL,而不是本地磁盘文件系统路径。也就是说,一旦在解析检索到的 HTML 输出期间遇到该值,Web 浏览器就必须单独下载内容。在生成 HTML 输出期间,并不是网络服务器必须以某种方式从其本地磁盘文件系统内联内容,正如您所想的那样。 HTTP 和 HTML 不是这样工作的。

因此,要解决您的问题,只需确保 data 属性的值表示有效的 HTTP URL。就像您在浏览器的地址栏中键入以检索内容一样。因此,当某个 URL 被请求时,您需要以某种方式告诉您的服务器返回所需的 PDF 内容。

实现该目标的最简单方法是创建一个简单的文件 servlet。这是一个启动示例(为简洁起见省略了明显的错误处理,例如空路径信息、不存在的文件等):

@WebServlet("/reports/*")
public class ReportServlet extends HttpServlet {

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String filename = request.getPathInfo().substring(1);
        File file = new File(System.getProperty("java.io.tmpdir"), filename);
        response.setHeader("Content-Type", getServletContext().getMimetype(filename));
        response.setHeader("Content-Length", String.valueOf(file.length()));
        response.setHeader("Content-Disposition", "inline; filename=\"" + filename + "\"");
        Files.copy(file.toPath(), response.getOutputStream());
    }

}

然后可以按如下方式调用它:

<object type="application/pdf" data="#{request.contextPath}/reports/#{bean.pdfPath.name}" height="600" width="900"></object>

另见:

关于jsf - 无法访问 tomcat 临时文件夹中的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21360932/

相关文章:

hibernate - 使用 Hibernate+DataSource 将应用程序从 Tomcat 7 迁移到 Weblogic 12

css - 将 Primefaces Jar 3.3 替换为 4.0 后,primefaces 计划事件颜色不起作用

javascript - p 命令按钮操作不会触发,但 oncomplete 会触发

java - 它如何与 JSF2 中的 bean 验证消息和 i18n 一起使用?

maven - 建议的 JSF 与 TomEE1.7.x 的依赖关系是什么?

css - 如何更改 <p :selectOneMenu>? 的悬停/突出显示元素的背景颜色

java - 在java中获取url的绝对路径

tomcat - Grails 网络应用程序图像目录在 war 中无法正常工作

java - RichFaces 丰富 :tree nodeSelectListener not being listened to

java - Primefaces,如何用另一个按钮折叠布局单元?