与this question一样,我让页面在Firefox,Chrome,IE9中运行......
然而,IE8无效。我收到一个错误弹出窗口:
Internet Explorer无法从[server]下载[filename] .jsp。
Internet Explorer无法打开此Internet站点。请求的网站不可用或无法找到。请稍后再试。
我的代码如下:
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);
}
}
我唯一能想到的是在将文件写入输出流后设置响应内容的长度,但正如我所说,它在现代浏览器中完美运行。
问题是,我们在IE8中也有一些我们无法摆脱的javascript错误。尽管存在错误,但页面的其余部分似乎仍可正常工作。错误是“SimpleTogglePanelManager undefined”,2x“Object expected”。
答案 0 :(得分:1)
根据this Microsoft KB article,它是设计的。
如果服务器使用安全套接字层(SSL)并在响应消息中添加了以下一个或两个HTTP标头,则会出现此问题:
Pragma:no-cache
缓存控制:no-cache,max-age = 0,必须重新验证
已移除res.setHeader("Pragma", "no-cache");
- 按预期工作。