我正在尝试将文本文件(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();
答案 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());