【问题标题】:Response Content type as CSV响应内容类型为 CSV
【发布时间】:2010-09-28 11:06:48
【问题描述】:

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

这不起作用:

Response.ContentType = "application/CSV";

【问题讨论】:

    标签: asp.net http csv


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 我喜欢使用 System.Net.Mime.ContentDisposition 对象来构建该字符串。
    【解决方案2】:

    根据RFC 4180,CSV 的MIME 类型为text/csv

    【讨论】:

      【解决方案3】:

      使用text/csv 作为内容类型。

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • 如果你使用 application/vnd.ms-excel。在 osx safari 上添加了“.xls”文件扩展名
        【解决方案5】:

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

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

        另外,mime 类型可能区分大小写...

        【讨论】:

          【解决方案6】:

          就这样使用

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

          【讨论】:

          • 当客户端是 Firefox 时,用双引号将文件名括起来为我解决了这个问题。
          • 如果你在 MVC 控制器中使用它,你需要用 return new EmptyResult() 结束控制器方法来获取文件名。否则 IE 会尝试将文件保存为ActionName.htm
          【解决方案7】:

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

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

          【讨论】:

            【解决方案8】:

            我发现 IE 的问题在于它会嗅探返回的数据并自行决定它认为已发送的内容类型。这会导致许多副作用,例如总是打开文本文件的另存为对话框,因为您正在使用数据传输压缩。解决方案是(在php代码中)......

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

            【讨论】:

              【解决方案9】:

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

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

              Firefox:SaveAs 对话框确实出现了,但 Firefox 不知道它是一个电子表格。建议用 Visual Studio 打开它! 50% 好

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

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

              【讨论】:

              • 如果 Firefox 希望您使用 Visual Studio 打开,则意味着您导出的是 HTML 而不是 CSV。
              • 2014 年的情况似乎并非如此,对我来说所有这些都很好。
              • 请定义“如上所述”
              【解决方案10】:

              我建议在 'myfilename.cvs' 前面插入一个 '/' 字符

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

              希望你能取得更好的成绩。

              【讨论】:

                【解决方案11】:

                对于 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.
                

                【讨论】:

                  猜你喜欢
                  • 2011-01-21
                  • 2019-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 1970-01-01
                  • 2015-03-10
                  • 1970-01-01
                  相关资源
                  最近更新 更多