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

时间:2014-01-26 07:33:04

标签: 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>
我在做错了什么?什么是正确的方法呢?

1 个答案:

答案 0 :(得分:1)

data属性的值是错误的。它应表示(相对)HTTP URL,而不是本地磁盘文件系统路径。这就是webbrowser在解析检索到的HTML输出时遇到值时必须单独下载内容。正如您所想的那样,在生成HTML输出期间,不是必须以某种方式从本地磁盘文件系统内联内容的Web服务器。这不是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>

另见: