【发布时间】:2010-09-28 11:06:48
【问题描述】:
我需要在 HTTP 响应中发送一个 CSV 文件。如何将输出响应设置为 CSV 格式?
这不起作用:
Response.ContentType = "application/CSV";
【问题讨论】:
我需要在 HTTP 响应中发送一个 CSV 文件。如何将输出响应设置为 CSV 格式?
这不起作用:
Response.ContentType = "application/CSV";
【问题讨论】:
使用text/csv 是最合适的类型。
您还应该考虑在响应中添加Content-Disposition 标头。通常文本/csv 将由 Internet Explorer 直接加载到 Excel 的托管实例中。这可能是也可能不是理想的结果。
Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");
以上将导致出现一个文件“另存为”对话框,这可能是您想要的。
【讨论】:
根据RFC 4180,CSV 的MIME 类型为text/csv。
【讨论】:
使用text/csv 作为内容类型。
【讨论】:
多年来,我一直在为此磨练一套完美的标头,这些标头在我所知道的所有浏览器中都能出色地工作
// these headers avoid IE problems when using https:
// see http://support.microsoft.com/kb/812935
header("Cache-Control: must-revalidate");
header("Pragma: must-revalidate");
header("Content-type: application/vnd.ms-excel");
header("Content-disposition: attachment; filename=$filename.csv");
【讨论】:
尝试其中一种其他 mime 类型(来自此处:http://filext.com/file-extension/CSV)
另外,mime 类型可能区分大小写...
【讨论】:
就这样使用
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();
【讨论】:
return new EmptyResult() 结束控制器方法来获取文件名。否则 IE 会尝试将文件保存为ActionName.htm。
在 ASP.net MVC 中,您可以使用 FileContentResult 和 File 方法:
public FileContentResult DownloadManifest() {
byte[] csvData = getCsvData();
return File(csvData, "text/csv", "filename.csv");
}
【讨论】:
我发现 IE 的问题在于它会嗅探返回的数据并自行决定它认为已发送的内容类型。这会导致许多副作用,例如总是打开文本文件的另存为对话框,因为您正在使用数据传输压缩。解决方案是(在php代码中)......
header('X-Content-Type-Options: nosniff');
【讨论】:
如上所述设置内容类型和内容配置会在不同的浏览器中产生截然不同的结果:
IE8:根据需要另存为对话框,并将 Excel 作为默认应用程序。 100% 好。
Firefox:SaveAs 对话框确实出现了,但 Firefox 不知道它是一个电子表格。建议用 Visual Studio 打开它! 50% 好
Chrome:提示被完全忽略。 CSV 数据显示在浏览器中。 0% 好。
当然,在所有这些情况下,我指的是开箱即用的浏览器,没有自定义 mime/应用程序映射。
【讨论】:
我建议在 'myfilename.cvs' 前面插入一个 '/' 字符
Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv");
希望你能取得更好的成绩。
【讨论】:
对于 C# MVC 4.5,您需要这样做:
Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + fileName + ".csv\"");
Response.Write(dataNeedToPrint);
Response.End();
return new EmptyResult(); //this line is important else it will not work.
【讨论】: