2

我使用Controller.File(Stream fileStream, String contentType, String fileDownloadName)方法从服务器下载文件。在我的情况下contentTypeapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet. 我确实为参数中的文件指定了一些特殊名称fileDownloadName。它在 Firefox、Opera、IE9 中运行良好。

但是,IE8 会返回操作的名称,而不是我指定的名称。看起来Download.xlsx,如果 url 是../Report/Download.

为什么会这样,我能做些什么呢?


根据.NET 中的 Content-Disposition 标头,我使用的重载应该可以解决问题。但是 IE8 希望对文件下载名称进行编码。而HttpUtility.UrlPathEncode例如,当使用编码时,Firefox 开始显示编码的文件名。

到底有没有万能的解决方案?

4

2 回答 2

2

一旦我未能找到一种通用方法来为至少 IE8+ 和 Mozilla 提供文件下载名称,作为临时解决方法,我使用以下方法:

Stream report = GetReport();
string filename = GetFileName();
if (Request.Browser.Browser.Equals("IE", StringComparison.CurrentCultureIgnoreCase))
    filename = HttpUtility.UrlPathEncode(filename);

return File(
    report, 
    "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", 
    filename);

Firefox 显示编码的文件名错误;非编码 - 由 IE8。由于当前的文化是Ru,文件名包含西里尔符号,这似乎是 IE8 的问题(可能还有空格)。


我愿意接受任何建议,这可能会导致我在 ASP.Net MVC 3 中提供文件下载名称的正确和/或反转(如果有)方法。在此之前,我接受这个糟糕的解决方法作为答案,因为它至少做这项工作。

于 2013-04-02T01:09:32.473 回答
0
 Response.AppendHeader("content-disposition", "attach;filename=" + fileName);

 return File(fileStream, contentType);

改变“附加;” 到“内联”;将导致文件在浏览器中打开,而不是浏览器提示保存文件。

注意:我也遇到了浏览器和文件名值的问题。非 ASCII 字符、空格和标点符号可能会导致此标头被浏览器忽略(下载文件名中带有“;”或“#”的文件会破坏文件名)。

于 2013-04-01T14:36:07.897 回答