2015-11-29 3 views
0

У меня есть серверная веб-панель, и я пытаюсь создать файл excel с POI Apache, который предоставляется как загрузка с помощью бэкэнда. Я могу записать файл на серверный диск, но не писать его в ответ HTTP.Загрузка двоичного файла, созданного в бэкэн-бэнде, отображается как простой текст на клиенте

Вот мой код

public void createExcel(){ 
    try { 
     ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
     HSSFWorkbook workBook = new HSSFWorkbook(); 
     HSSFSheet sheet = workBook.createSheet("hello world"); 
     HSSFRow row = sheet.createRow((short) 0); 
     HSSFCell cell; 
     cell = row.createCell(0); 
     cell.setCellValue(new HSSFRichTextString("Hello")); 
     cell = row.createCell(1); 
     cell.setCellValue(new HSSFRichTextString("world")); 

     workBook.write(bos); 
     bos.flush(); 

     FacesContext fc = FacesContext.getCurrentInstance(); 

     downloadExcel(bos, fc); 
    } catch (FileNotFoundException e) { 
     log.debug("file not found ", e); 
    } catch (IOException e){ 
     log.debug("IOException ", e); 
    } 
} 

public void downloadExcel(ByteArrayOutputStream baos, FacesContext fc){ 
    HttpServletResponse response = (HttpServletResponse)fc.getExternalContext().getResponse(); 
    response.setContentType("application/vnd.ms-excel"); 
    response.addHeader("Content-Disposition", "attachment; filename=testxls.xls"); 

    try { 
     ServletOutputStream out = response.getOutputStream(); 
     baos.writeTo(out); 

     out.flush(); 
     out.close(); 
    } catch (IOException e) { 
     log.error("IOException ", e); 
    } 
    fc.responseComplete(); 
} 

И результат следующий

response

Это происходит во всех браузерах я пробовал: Chrome, FF и IE. Надеюсь, вы можете указать, что мне здесь не хватает.

+0

Результат нечитаемый. Не размещайте фотографии текста. Отправьте текст. Вы считали создание CSV? Бесконечно проще, и Excel будет конвертировать его на клиента. – EJP

+0

Нажмите F12 в браузере, откройте вкладку «Сеть», щелкните запрос, представляющий загрузку файла, и посмотрите заголовки ответов HTTP. Какой именно заголовок 'Content-Type' на самом деле установлен? Тем не менее, является ли одним из этих вопросов? http://stackoverflow.com/q/9391838 или http://stackoverflow.com/q/7822758? – BalusC

+0

Ответные заголовки такие же, как я их устанавливал. Просмотрели данные QA и добавили некоторые незначительные изменения в мой ответ (reset, contentLength), но результат все тот же. –

ответ

0

Наконец нашел решение в BalusC данной ссылке. Я вызвал метод createExcel() в JSF внутри тега <a4j:commandButton>, который вызвал метод через ajax. Изменил его на <h:commandButton> и теперь он работает.

-1

Браузер никогда не открывает диалоговое окно, предлагающее вам загрузить файл при навигации по сервлетам? Я думаю, причина в том, что вы пропустили заключите имя файла в кавычки:

response.addHeader("Content-Disposition", "attachment; filename=\"testxls.xls\""); 
+0

Браузер не открывает диалоговое окно загрузки, а изменение заголовка ничего не меняет. –

+0

Это вздор. Программа, похоже, в порядке. Вы провели больше лабораторных тестов? Изменение двоичных данных некоторым текстовым сообщением? –