我需要在 HTTP 响应中发送一个 CSV 文件。如何将输出响应设置为 CSV 格式?
这不起作用:
Response.ContentType = "application/CSV";
使用text/csv
是最合适的类型。
您还应该考虑Content-Disposition
在响应中添加标头。通常文本/csv 将由 Internet Explorer 直接加载到 Excel 的托管实例中。这可能是也可能不是理想的结果。
Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");
以上将导致出现文件“另存为”对话框,这可能是您想要的。
CSV 的 MIME 类型text/csv
符合RFC 4180。
用作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: //fileext.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();
在 ASP.net MVC 中,可以使用 aFileContentResult
和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.