为什么Content-Disposition标头在IE 8中不起作用?

时间:2009-03-30 17:59:19

标签: asp.net

我正在尝试将文本文件(CSV)流式传输到响应中,以下代码在Firefox 3中完美运行,但是当我使用IE时,看起来它想要下载实际的.aspx页面,并抱怨文件内容与文件扩展名或类型不匹配。如果我然后选择下载文件,它会正确下载CSV数据并在Excel中打开它。我做错了什么?

    DataTable dt = ExtensionsProvider.ListPrivateCallCostsForCsv(reportFilter.BusinessUnit, reportFilter.StartDate,
                                                             reportFilter.EndDate);
    Response.Clear();
    Response.Buffer = true;
    Response.ContentType = "text/csv";
    Response.AddHeader("Content-Disposition", "filename=" + GetExportFileName()); 
    DataTableHelper.WriteCsv(dt, Response.Output, false);
    Response.End();

3 个答案:

答案 0 :(得分:9)

Response.AddHeader("Content-Disposition", "filename=" + GetExportFileName());

应该是:

Response.AddHeader("Content-Disposition", "attachment;filename=" + GetExportFileName());

如果没有主Content-Disposition值,IE只会使用网址的尾部 - something.aspx - 作为文件名。

(上面假设GetExportFileName()返回一个被删除大多数标点符号的清理文件名。在IE中使用标题参数作为标记或引用字符串可能会引起一些烦恼;请参阅this question详情)

答案 1 :(得分:0)

它也不适用于内联。当然它适用于所有其他浏览器

HttpServletResponse response = aCtx.getResponse();
response.setContentType("text/plain");
response.addHeader("Content-Disposition", "inline;filename=log.txt");

答案 2 :(得分:-1)

除了filename参数外,您还必须为Content-Disposition标头赋予值。

您可能拥有more luck with the "inline" value而不是“附件”值:

Response.AddHeader("Content-Disposition", "inline;filename=" + GetExportFileName());