0

Как и в this question, я получил страницу, чтобы работать в Firefox, Chrome, IE9, ...Получение загрузки файла для работы с RichFaces и IE8

Однако IE8 не работает. Я получаю сообщение об ошибке:

Internet Explorer не может загрузить [имя_файла] .jsp с [сервера].

Internet Explorer не смог открыть этот интернет-сайт. Запрошенный сайт либо недоступен, либо не может быть найден. Повторите попытку позже.

Мой код выглядит следующим образом:

public String downloadFile() { // called from a h:commandLink 
    String filename = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap().get("file"); 
    File file = new File(filename); 
    HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse(); 

    writeOutContent(response, file); 

    FacesContext.getCurrentInstance().responseComplete(); 
    return "REFRESH"; 
} 

private void writeOutContent(final HttpServletResponse res, final File content) { 
    if (content == null) { 
     return; 
    } 
    try { 
     res.setHeader("Pragma", "no-cache"); 
     res.setDateHeader("Expires", 0); 
     res.setHeader("Content-Disposition", "attachment; filename=\"" + content.getName() + "\""); 
     ServletContext servletContext = (ServletContext) FacesContext.getCurrentInstance().getExternalContext().getContext(); 
     String contentType = servletContext.getMimeType(content.getName()); 
     if (contentType == null) { 
      contentType = "application/octet-stream"; 
     } 
     res.setContentType(contentType); 
     FileInputStream fis = new FileInputStream(content); 
     ServletOutputStream os = res.getOutputStream(); 
     int length = 0; 
     int data = fis.read(); 
     while (data != -1) { 
      length += 1; 
      os.write(data); 
      data = fis.read(); 
     } 
     fis.close(); 
     res.setContentLength(length); 
     os.flush(); 
     os.close(); 
    } catch (final IOException ex) { 
     Logger.getLogger(ApplicationController.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

Единственное, что я мог думать о том, что я установить длину содержимого ответа после записи файла в выходной поток, но, как я сказал, что это прекрасно работает в современных браузерах.

Дело в том, что мы также имеем некоторые ошибки JavaScript в IE8, от которых мы не можем избавиться. Однако остальная часть страницы работает, несмотря на ошибки. Ошибки: «SimpleTogglePanelManager undefined» и «Объект ожидаемый».

+0

Возможный дубликат [Internet Explorer не может загрузить файл, обслуживаемый JSF] (http://stackoverflow.com/questions/5034454/internet-explorer-cannot-download-the-file-served-by-jsf) – BalusC

+0

Действительно , слишком плохо, что я не нашел его раньше. – brandstaetter

ответ

1

Согласно this Microsoft KB article это по дизайну.

Проблема возникает, если сервер использует Secure Sockets Layer (SSL) и добавил один или оба из следующих HTTP заголовков в сообщении ответа:

Pragma: нет кэша

Cache -control: no-cache, max-age = 0, must-revalidate

Удалено res.setHeader("Pragma", "no-cache"); - работает по назначению.

См. Также question and answer.

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

  • Нет связанных вопросов^_^