首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JasperReports PdfServlet以PDF格式保存报表--如何设置浏览器的文件名以提示用户?

JasperReports PdfServlet以PDF格式保存报表--如何设置浏览器的文件名以提示用户?
EN

Stack Overflow用户
提问于 2012-08-23 16:06:12
回答 1查看 3.6K关注 0票数 0

堆栈:JSF + PrimeFaces on JBoss AS with JasperReports

我一直在使用一种使用JasperReports导出PDF格式的模式,有三个步骤:

1从war中的路径获取已编译的Jasper报告。

2将JasperPrint对象放置在会话中

3重定向到PdfServlet的URL

因此,当用户从图形用户界面单击一个p:commandButton时,将调用backing的方法,该方法通过1、2和3执行,如下面的示例代码所示:

xhtml文件:

代码语言:javascript
复制
<p:commandButton ajax="false" action="#{indexController.exportPDF}" value="Export PDF"/>

备份bean代码:

代码语言:javascript
复制
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;
}

我有两个问题:

您看到这种方法有什么明显的代码气味或限制吗?

使用上面的示例代码,Chrome和Conkeror都可以保存报告,但是它们为用户保存文件的默认文件名是"pdf“。我如何将其配置为有意义的名称(例如"report-2012-08-23c.pdf")?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-24 11:23:16

至于“另存为”文件名的具体问题,它默认为请求URL中的最后一条路径(如果是/servlets/pdf,实际上就是pdf),除非Content-Disposition头中另有规定。

这个问题并不是由JSF代码直接引起的(尽管它本身有点奇怪,但这是一个不同的问题/问题),而是在/servlets/pdf上映射的servlet中更多。要设置所需的“另存为”文件名,需要在将任何字节写入响应之前添加以下行:

代码语言:javascript
复制
response.setHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

如果需要,可以将attachment替换为inline,如果您想在默认情况下内联显示它。

但是,浏览器会忽略此值,并坚持使用请求URL中的最后一条路径。因此,为了涵盖该浏览器,您需要自己在请求URL中包含所需的文件名,并更改servlet映射。

例如。

代码语言:javascript
复制
String filename = "report-2012-08-23c.pdf";
externalContext.redirect("servlets/pdf/" + filename);

使用

代码语言:javascript
复制
@WebServlet("/servlets/pdf/*") // instead of @WebServlet("/servlets/pdf")

使用此URL模式,文件名位于servlet中

代码语言:javascript
复制
String filename = request.getPathInfo().substring(1);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12095833

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档