【问题标题】:CSV files being saved as XLS or nothing on downloadCSV 文件被保存为 XLS 或没有下载
【发布时间】:2015-06-16 19:38:52
【问题描述】:

我正在尝试允许用户下载 csv 文件,并使用 Excel 打开它(最好已选择“使用 Excel 打开文件”选项)。

//Cont.cs
public ActionResult CSVLink(string file)
    {
        var dir = Server.MapPath("/CSV/Stats");
        var path = Path.Combine(dir, file + ".csv"); // I have tried this both with and w/o adding the csv here, and on the anchor's href instead
        return File(path, "application/csv");
    }

//Links.cshtml
<a target="_blank" href="/CSVLink?file=Hits_20150616">Today's Hits</a>

这主要是有效的,因为它允许用户下载文件,但文件扩展名不保持为 csv。问题似乎出在return File(path, "application/csv");,更具体地说是application/csv

以下是各种 mime 类型发生的情况的列表:

  • application/csv - 文件下载,但没有文件扩展名
  • text/csv - 一样
  • application/binary - 一样
  • application/vnd.ms-excel - 文件下载为 .xls 文件,这会破坏它在 Excel 中的外观。

这是另一个奇怪的事情:所有没有扩展名的文件,如果我重命名它们并将 .csv 放在最后,它们在 Excel 中打开看起来很完美。这在 IE 和 Firefox 中都会发生(octet-stream 除外,这使它在新网页中以纯文本形式打开)。

我做错了什么?

【问题讨论】:

    标签: c# mime-types


    【解决方案1】:

    稍微澄清一下问题:您有一个名为/CSV/Stats/SomeFileName.csv 的文件,并且您希望将该内容提供给用户,对吗?但是我看不到您从文件中读取字节的位置以提供内容-您正在提供文件,这是不对的,除非您要提供到@987654322的重定向@ 如果您不提供重定向,则需要执行以下操作:

    var s = File.ReadAllText(path);
    return File(Encoding.Unicode.GetBytes(s.ToString()), "text/csv", file + ".csv");
    

    最后:使用file 作为参数名称可能是一件坏事,这至少会产生误导,最坏的情况是会引起混淆。

    【讨论】:

    • 从文件中读取字节?我不认为这是我想做的。我希望他们单击​​一个链接并让他们下载 csv 文件。我的这个设置适用于 pdf,所以它也应该适用于 csv。我认为这是拥有正确的 mimetype 的问题。
    • 嗯。当我返回一个文件时,一般来说,我也只是从文件系统中取出它并将其交给 - 在我的情况下,它存储在文件系统中,就像你的那样。您拥有的 mime 类型对于 text/csv 是正确的......但是我从我的特定解决方案返回的唯一 text/csv 来自内存,而不是文件 - 我提供的其他文件是 application/octet-stream .认为值得一试阅读并退回?
    猜你喜欢
    • 2013-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 1970-01-01
    • 2014-01-07
    • 2015-05-30
    相关资源
    最近更新 更多