响应内容类型为CSV


328

我需要在HTTP响应中发送CSV文件。如何将输出响应设置为CSV格式?

这不起作用:

Response.ContentType = "application/CSV";

Answers:


491

使用text/csv是最合适的类型。

您还应该考虑将Content-Disposition标头添加到响应中。通常,Internet Explorer将text / csv直接加载到Excel的托管实例中。这可能是或可能不是理想的结果。

Response.AddHeader("Content-Disposition", "attachment;filename=myfilename.csv");

以上将导致出现一个文件“另存为”对话框,这可能是您想要的。


2
我喜欢使用System.Net.Mime.ContentDisposition对象构建该字符串。
罗尼·欧弗比



48

多年来,我一直在为此完善一套标头,这些标头在我所知道的所有浏览器中都能出色地工作

// 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");

7
如果您使用application / vnd.ms-excel。在OSX Safari浏览器增加了一个“.xls的”文件扩展名
卢克·史密斯

28

尝试其他一种mime类型(从此处:http : //filext.com/file-extension/CSV

  • 文字/逗号分隔值
  • 文字/ csv
  • 应用程序/ csv
  • 应用程序/ excel
  • 应用程序/vnd.ms-excel
  • 应用程序/ vnd.msexcel

此外,MIME类型可能区分大小写...


text/csv为我工作

15

像那样使用

Response.Clear();
Response.ContentType = "application/CSV";
Response.AddHeader("content-disposition", "attachment; filename=\"" + filename + ".csv\"");
Response.Write(t.ToString());
Response.End();

当客户端是Firefox时,将文件名括在双引号中可解决此问题。
格雷厄姆

1
如果在MVC控制器中使用它,则需要以结束控制器方法,return new EmptyResult()以使文件名保持不变。否则IE会尝试将文件另存为ActionName.htm
3Dave 2013年

5

在ASP.net MVC中,可以使用FileContentResultFile方法:

public FileContentResult DownloadManifest() {
    byte[] csvData = getCsvData();
    return File(csvData, "text/csv", "filename.csv");
}

3

我发现IE的问题在于,它会嗅探返回数据并决定是否认为已发送了哪种内容类型。这会导致许多副作用,例如,由于使用的是数据传输压缩,因此始终打开文本文件的saveAs对话框。解决方法是(用PHP代码)……

header('X-Content-Type-Options: nosniff');

2

如上所述设置内容类型和内容处置会在不同的浏览器中产生不同的结果:

IE8:“另存为”对话框,根据需要,将Excel作为默认应用程序。100%好。

Firefox:确实会出现“另存为”对话框,但是Firefox并不知道它是电子表格。建议使用Visual Studio打开它!50%好

Chrome:完全忽略了提示。CSV数据显示在浏览器中。0%好。

当然,在所有这些情况下,我指的是浏览器,因为它们是开箱即用的,没有对mime /应用程序映射进行自定义。


如果Firefox希望您使用Visual Studio打开,则意味着您正在导出HTML,而不是CSV。
马丁

2014年的情况似乎并非如此,对我来说,所有方法都运行良好。
MikeKulls

请定义“如上所述”
xhienne

2

我建议在“ myfilename.cvs”前面插入“ /”字符

Response.AddHeader("Content-Disposition", "attachment;filename=/myfilename.csv");

希望您能得到更好的结果。


0

对于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.
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.