Как и в 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» и «Объект ожидаемый».
Возможный дубликат [Internet Explorer не может загрузить файл, обслуживаемый JSF] (http://stackoverflow.com/questions/5034454/internet-explorer-cannot-download-the-file-served-by-jsf) – BalusC
Действительно , слишком плохо, что я не нашел его раньше. – brandstaetter