CSV文件保存为XLS或未下载任何内容

时间:2015-06-16 19:38:53

标签: c# mime-types

我正在尝试允许用户下载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除外,这使得它在新网页中以纯文本形式打开)。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

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

/CSV/Stats/SomeFileName.csv

最后:使用var s = File.ReadAllText(path); return File(Encoding.Unicode.GetBytes(s.ToString()), "text/csv", file + ".csv"); 作为您的参数名称可能是一件坏事 - 在那里 - 它至少会产生误导,最坏的情况会引起混淆。