设置byte []作为文件下载

时间:2012-06-29 10:43:51

标签: java http-headers jasper-reports bytearray seam

我有一个生成Excel文件并输出为byte []的Jasper报告,我希望该文件在浏览器中显示为下载,但此刻它只是将原始代码打印到浏览器。

代码的相关部分如下所示,这是从AJAX请求启动的(页面已经加载):

    JasperReport jasperReport;
    JasperPrint jasperPrint;
    HttpServletResponse response = (HttpServletResponse) context.getExternalContext().getResponse();    

    byte[] excel = null;
    FacesContext facesContext = FacesContext.getCurrentInstance();

    try {
        ArrayList<SwimDataReport> dataList = getData();
        if(dataList!=null){
            JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(dataList, false);

            jasperReport = JasperCompileManager.compileReport(reportFile.getPath());
            jasperPrint = JasperFillManager.fillReport(jasperReport, parameters, dataSource);
            JRXlsExporter exporter = new JRXlsExporter();
            ByteArrayOutputStream  xlsReport = new ByteArrayOutputStream();
            exporter.setParameter(JRExporterParameter.JASPER_PRINT, jasperPrint);
            exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, xlsReport);            
            exporter.exportReport();
            excel = xlsReport.toByteArray();

            response.reset();
            response.setContentType("application/vnd.ms-excel");
            response.setHeader("Content-disposition", "attachment; filename=\"Export.xls\"");

            xlsReport.close();

            OutputStream  ouputStream = response.getOutputStream();
            ouputStream.write(excel);
            ouputStream.close();

            facesContext.responseComplete();
            this.cleanUp();
        }else{
            return;
        }
    } catch (JRException e) {       
        e.printStackTrace();
    } catch (Exception e) {
        e.printStackTrace();
    }

我出错的任何想法?

4 个答案:

答案 0 :(得分:1)

看来您无法从AJAX请求下载文件,因此我使用了h:commandButton来触发下载。

答案 1 :(得分:0)

我的工作代码与此类似,有一个大写的D。

即:Content-Disposition而不是Content-disposition

这也是RFC2183强制执行的方式。

答案 2 :(得分:0)

尝试使用a4j:htmlCommandLink触发下载请求,并在代码中提供target="_NEW"

答案 3 :(得分:0)

Excel文件的内容类型为:

用于BIFF .xls文件: application / vnd.ms-excel

for Excel2007及更高版本.xlsx文件: application / vnd.openxmlformats-officedocument.spreadsheetml.sheet

Insted of: &#34;内容配置&#34;,&#34;附件;文件名= <强> \&#34; Export.xls \&#34; &#34;

尝试使用: &#34;内容配置&#34;,&#34;附件;文件名= <强> Export.xls &#34;