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/Stats/SomeFileName.csv
的文件,你想将该内容提供给用户,对吗? 但是我没有看到你从文件中读取字节的位置,以便提供内容 - 你正在提供一个文件,这是不对的,除非你要提供重定向到/CSV/Stats/SomeFileName.csv
如果您不提供重定向,则需要执行以下操作:
var s = File.ReadAllText(path);
return File(Encoding.Unicode.GetBytes(s.ToString()), "text/csv", file + ".csv");
最后:使用file
作为参数名称可能是一件坏事,在那里 - 它至少具有误导性,最坏的情况会引起混淆。