使用JSF下载文件

时间:2012-11-20 17:21:22

标签: file jsf download

大家好!

我遇到了麻烦。我试图在jsf web应用程序中保存excel文件。 我通过我的工具生成文件并尝试获取“保存”窗口,但我失败了。

这是我的代码:

  <div>
  <h:commandButton value="Apply" actionListener="#{hornPhonesBean.generateReport}"/>
  </div>

和:

   public void generateReport(ActionEvent event) {
    System.out.println("GENERATE REPORT FROM = " + this.dateFrom + "; TO = " + this.dateTo);

    try {
        XSSFWorkbook workbook = (XSSFWorkbook) HornReportGenerator.getWorkbook(null, null);
        String fileName = "1.xlsx";

        FacesContext fc = FacesContext.getCurrentInstance();
        ExternalContext ec = fc.getExternalContext();

        // Some JSF component library or some Filter might have set some headers in the buffer beforehand. We want to get rid of them, else it may collide.
        ec.responseReset(); 

        // Check http://www.w3schools.com/media/media_mimeref.asp for all types. Use if necessary ExternalContext#getMimeType() for auto-detection based on filename.
        ec.setResponseContentType("application/vnd.ms-excel"); 

        // Set it with the file size. This header is optional. It will work if it's omitted, but the download progress will be unknown.
        //ec.setResponseContentLength(contentLength); 

        // The Save As popup magic is done here. You can give it any file name you want, this only won't work in MSIE, it will use current request URL as file name instead.
        ec.setResponseHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\""); 

        OutputStream output = ec.getResponseOutputStream();
        workbook.write(output); 
        output.flush();
        output.close();

        fc.responseComplete(); // Important! Otherwise JSF will attempt to render the response which obviously will fail since it's already written with a file and closed.
        System.out.println("END");
    } catch (Exception e) {
        e.printStackTrace();
    }
}

我在这里和其他论坛上阅读建议 - 每个人都说我不应该使用,但我根本没有使用它。

然后我认为问题可能在

 <ice:form>, 

我保留了

 <h:commandButton>, 

然后我改为

 <h:form>, 

但它没有帮助。

可能是请求中的问题 - 它有标题Faces-Request partial / ajax。但我不确定。

请给我一些想法 - 我已经花了4个小时来处理这个疯狂的jsf下载问题)

1 个答案:

答案 0 :(得分:3)

  

可能是请求中的问题 - 它有标题Faces-Request partial / ajax。但我不确定。

这表明请求是ajax请求。您无法通过ajax下载文件。 Ajax请求由JavaScript处理,出于明显的安全原因,无法以编程方式弹出另存为对话框,也无法访问/操作客户端的磁盘文件系统。

但是,您的代码段没有显示您使用的是ajax。也许你过分简化了它,或者你正在使用ICEfaces,它可以在所有标准的JSF命令组件上自动启用ajax。

在任何情况下,您都需要确保发送ajax请求。

另见: