我正在尝试将JasperReports生成的PDF文件发送到用户的浏览器,我无法在我的托管bean方法中找到错误,这是一个片段:
System.out.println("Making pdf...");
FacesContext fc = FacesContext.getCurrentInstance();
ExternalContext ec = fc.getExternalContext();
String tplPath = ec.getRealPath("testTemplate.jrxml");
JasperReport jasperReport = JasperCompileManager.compileReport(tplPath);
JasperPrint jasperPrint = JasperFillManager.fillReport(jasperReport, new HashMap<String,Object>(), ds );
String pdfName = "/testReport.pdf";
String pdfPath = ec.getRealPath(pdfName);
JasperExportManager.exportReportToPdfFile(jasperPrint, pdfPath);
System.out.println("PDF ready!");
ec.responseReset();
ec.setResponseContentType(ec.getMimeType(pdfPath));
//ec.setResponseContentLength(contentLength);
ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + pdfName + "\"");
InputStream input = new FileInputStream(pdfPath);
OutputStream output = ec.getResponseOutputStream();
IOUtils.copy(input, output);
System.out.println("Sending to browser...");
fc.responseComplete();
通过简单的用户点击来调用它:
<p:menuitem value="TestPDF" action="#{menuController.getTestPdf()}" />
我觉得这很容易找到。为什么我看不到它? :)
答案 0 :(得分:8)
<p:menuitem>
默认使用ajax。您无法通过ajax下载文件。 JavaScript具有正当的安全性原因,无法以编程方式强制另存为对话与变量中的任意内容。
只需关闭ajax。
<p:menuitem ... ajax="false" />