【问题标题】:Fail to Access a file inside tomcat temp folder无法访问 tomcat 临时文件夹中的文件
【发布时间】:2014-02-17 02:46:01
【问题描述】:

我正在开发一个带有 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>

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

【问题讨论】:

  • 最好生成PDF并将其临时存储在内存中,而不是将其写入文件。为此,请将 PDF 写入 ByteArrayOutputStream 并在其上调用 toByteArray() 以获取 PDF 作为 byte[]
  • 这是一个好方法,但不幸的是,当我这样做时,我无法在 pdf 查看器中显示 pdf 文件,而是浏览器尝试下载文件

标签: jsf tomcat jsf-2


【解决方案1】:

data 属性的值错误。它应该代表一个(相对)HTTP URL,而不是本地磁盘文件系统路径。即,一旦在解析检索到的 HTML 输出过程中遇到该值,网络浏览器就必须单独下载内容。正如您似乎认为的那样,在生成 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>

另见:

【讨论】:

  • 只有一个问题,request.contextPath 返回两个上下文路径!我的上下文路径是 Goli-web,它返回 /Goli-web/Goli-web 我用“”替换其中一个,但我认为这不是一个好习惯
  • webapp中显然有一个开发不佳的HttpServletRequestWrapper
  • 我消除了 #{request.contextPath} 部分,现在一切正常。显然上下文路径总是打印在数据 url 的开头。
  • 太棒了。但请记住,这不是默认行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-03-09
  • 1970-01-01
  • 2019-02-27
  • 1970-01-01
  • 1970-01-01
  • 2016-06-30
  • 2016-07-28
相关资源
最近更新 更多