2012-06-29 3 views
3

У меня есть отчет Jasper, который генерирует файл Excel и выводит его в качестве байта [], я хочу, чтобы файл отображался как загрузка в браузере, но на данный момент он просто печатает необработанное кода в браузер.Set byte [] скачать как файл

Соответствующая часть кода ниже, это инициируется из запроса 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(); 
    } 

Любые идеи, где я неправильно?

ответ

1

Похоже, вы не можете загрузить файл с помощью запроса AJAX, поэтому я использовал команду h: commandButton для запуска загрузки.

0

Мой рабочий код похож на это имеет прописной D.

т.е .: Content-Disposition вместо Content-disposition.

Это также как RFC2183 мандаты.

+0

Спасибо за предложение Stefano, я попробовал, но он все еще просто отображает необработанный код на веб-странице – DaveB

0

Попробуйте использовать a4j:htmlCommandLink, чтобы запустить запрос загрузки и дать target="_NEW" в теге.

0

типа содержимого для файлов Excel являются:

для .xls файла BIFF: приложения/vnd.ms-первенствует

для Excel2007 и выше .xlsx файлов: приложения/VND. openxmlformats-officedocument.spreadsheetml.sheet

InstEd из: "Content-распоряжения", «привязанность; имя файла = \ "Export.xls \" "

Попытайтесь использовать: " Content-disposition "," attachment; filename = Export.xls «

Смежные вопросы