用于编写excel文件的Java servlet在IE7 / IE8中导致错误

我有一个jsf应用程序,当用户点击一个button时,有一个支持的bean方法调用这个servlet。

问题是在IE7和IE8中,文件无法下载。 它给出了错误信息:

Internet Explorer cannot download ExcelGenerator from mydomain.com

我需要做什么才能在IE7 / IE8中工作? 我是否需要设置一些额外的标题?

调用servlet的backing bean方法:

 public void generateExcel() { FacesContext context = FacesContext.getCurrentInstance(); String url = context.getExternalContext().getRequestContextPath() + "/ExcelGenerator"; context.getExternalContext().redirect(url); } 

生成excel文件的Servlet:

  public class ExcelGenerator extends HttpServlet { private static final long serialVersionUID = 1L; private static final Logger LOG = LoggerFactory.getLogger(ExcelGenerator.class); @Override public void init(ServletConfig config) throws ServletException { super.init(config); } @SuppressWarnings("unchecked") protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { SXSSFWorkbook wb = new SXSSFWorkbook(); Sheet sheet = wb.createSheet("Results"); List<List<TableData>> results = (List<List<TableData>>) request.getSession().getAttribute("results"); String tableName = (String) request.getSession().getAttribute("tableName"); DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Date date = new Date(); String filename = tableName+"-"+df.format(date)+".xlsx"; OutputStream out = null; response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setHeader("Expires:", "0"); // eliminates browser caching response.setHeader("Content-Disposition", "attachment; filename="+filename); int rowCounter = 0; // Create the rows for(List<TableData> l : results) { int counter = 0; Row row = sheet.createRow(rowCounter); for(TableData td : l) { Cell cell = row.createCell(counter); // if we're on the first row, get the column description, else get the data if(rowCounter == 0) { cell.setCellValue(td.getColumnDescription()); } else { cell.setCellValue(td.getData()); } counter++; } rowCounter++; } try { out = response.getOutputStream(); wb.write(out); out.flush(); } catch (Exception e) { LOG.debug(e.getStackTrace().toString()); } finally { out.close(); wb.dispose(); } } } 

Internet Explorer无法从mydomain下载ExcelGenerator。

当域位于HTTPS且响应不允许caching时,此错误是典型的。 另见MS KB 316431 。

修复相当简单:

 if (request.isSecure()) { response.setHeader("Cache-Control", "public"); response.setHeader("Pragma", "public"); } 

也可以看看:

  • IE不能下载foo.jsf。 IE浏览器无法打开这个网站。 请求的网站不可用或无法find

看看这个页面 ,它列出了最近的浏览器版本与Content-Disposition头的兼容性。 有一些值的组合,特别是围绕如何编码文件名部分,这可能会导致IE显示错误。

我遇到了这个问题,下面的input解决了这个问题

response.setContentType(“application / vnd.ms-xls; charset = utf-8”);

response.setHeader( “内容处置”, “附件;文件名=” +文件名);

response.setHeader(“Pragma”,“public”);

response.setHeader(“Cache-Control”,“public,max-age = 3800”);