我正在使用 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/