JasperReports的PDFServlet中保存的PDF报告 - 我该如何设置文件名的浏览器提

2019-07-31 04:05发布

堆栈:在JBoss JSF + PrimeFaces ASJasperReports的

我一直在使用使用JasperReports的一个三步过程,PDF格式导出的模式:

[1]获得从在战争中的路径编译碧玉报告

[2]放置JasperPrint对象上的会话

[3]重定向到PDFServlet中的URL

因此,当从GUI用户点击一个p:的commandButton背衬-bean的方法被调用,通过变为[1],[2]和[3],如以下示例代码:

XHTML文件:

<p:commandButton ajax="false" action="#{indexController.exportPDF}" value="Export PDF"/>

后台bean的代码:

private void putPrintObjectInSession() throws JRException {
    ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
    ServletContext context = (ServletContext) externalContext.getContext();
    String reportFileName = context.getRealPath("/reports/PrimeNumbersReport.jasper");
    File reportFile = new File(reportFileName);
    if (!reportFile.exists())
        throw new JRRuntimeException(".jasper file not found in the war.");
    Map parameters = new HashMap();
    parameters.put("ReportTitle", "2nd Prime Numbers Report");
    parameters.put("BaseDir", reportFile.getParentFile());
    JasperPrint jasperPrint = 
            JasperFillManager.fillReport(
                      reportFileName, 
                      parameters, 
                      getSQLConnection()
                    );
    ((HttpSession) externalContext.getSession(false)).setAttribute(BaseHttpServlet.DEFAULT_JASPER_PRINT_SESSION_ATTRIBUTE, jasperPrint);
}

public String exportPDF() throws IOException, JRException {
    putPrintObjectInSession();
    FacesContext facesContext = FacesContext.getCurrentInstance();  
    ExternalContext externalContext = facesContext.getExternalContext();  
    externalContext.redirect("servlets/pdf");
    return null;
}

我有两个问题:

[我]你看到任何明显的代码异味或限制这种做法?

[II]与示例代码Chrome和Conkeror以上可以保存它们呈现给用户,用于保存文件的报告,但默认的文件名是简单地“PDF”。 我怎么可以配置为一个有意义的名称(例如“报道,2012-08-23c.pdf”)?

Answer 1:

至于你的“另存为”文件名,则默认为请求URL中的最后一个路径(这是在的情况下,具体问题/servlets/pdf确实只是pdf ),除非另有规定Content-Disposition头。

这个问题不直接通过您的JSF代码引起的(虽然它是在它自己的一种奇怪的,但是这是一个不同的问题/问题),但更多的在其中被映射到该servlet /servlets/pdf 。 设置所需的“另存为”文件名,你需要写响应的任何字节之前添加以下行:

response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

您可以在必要时更换attachment通过inline ,如果你想用默认的内联显示它。

Internet Explorer浏览器,但是,忽略这个值,棍棒请求URL中使用的最后一条路径。 因此,要覆盖浏览器,以及,你需要在请求URL自己所需的文件名和更改的servlet映射。

String filename = "report-2012-08-23c.pdf";
externalContext.redirect("servlets/pdf/" + filename);

@WebServlet("/servlets/pdf/*") // instead of @WebServlet("/servlets/pdf")

有了这个URL模式,文件名可以由servlet内

String filename = request.getPathInfo().substring(1);


文章来源: JasperReports PdfServlet to save report in PDF - how can I set the filename for the browser to prompt the user?