Получение загрузки файла для работы с richfaces и IE8 - PullRequest
0 голосов
/ 07 февраля 2012

Как и в этом вопросе , я получил страницу для работы в Firefox, Chrome, IE9, ...

Однако 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» и 2x «Ожидаемый объект».

1 Ответ

1 голос
/ 07 февраля 2012

Согласно этой статье Microsoft KB это специально.

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

Pragma: no-cache

Контроль кэша: no-cache, max-age = 0, must-revalidate

Удалено res.setHeader("Pragma", "no-cache"); - работает как задумано.

См. Также вопрос и ответ .

...