CSV 文件在下载时另存为 XLS 或没有任何内容

本文关键字:任何内 XLS 另存为 文件 下载 CSV | 更新日期: 2023-09-27 17:56:48

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

我做错了什么?

CSV 文件在下载时另存为 XLS 或没有任何内容

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

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

最后:使用file作为参数名称可能是一件坏事,在那里 - 它至少具有误导性,最坏的情况会引起混淆。