0

每个人!

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

这是我的代码:

  <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 部分/ajax。但我不确定。

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

4

1 回答 1

3

也许是请求中的问题 - 它具有标头 Faces-Request 部分/ajax。但我不确定。

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

但是,您的代码片段并未显示您正在使用 ajax。也许您过于简单化了,或者您正在使用 ICEfaces,它在所有标准 JSF 命令组件上静默自动启用 ajax。

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

也可以看看:

于 2012-11-20T17:40:53.760 回答