如何编码文件名以供下载?

时间:2009-10-21 02:00:26

标签: c# asp.net-mvc http encoding

当文件名是“Algunas MARCAS quenosacompañan”时,当我尝试下载该文件时,ASP.NET MVC会引发System.FormatException。但如果文件名是“Asistente de Gerencia Comercial”则不然。

我想这是因为与UTF-8编码相关的内容,但我不知道如何编码该字符串。

如果我是对的,我如何用UTF-8编码对字符串进行编码?如果我不对,我的问题是什么?

9 个答案:

答案 0 :(得分:25)

我将这样的文件名编码为下载,

HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));

答案 1 :(得分:5)

根据ZZ Coder的回答,因为我正在使用FileResult,所以我决定将文件名编码为:

HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)

答案 2 :(得分:1)

这个问题多年来一直为人所知。据我所知,目前没有可互操作的方法,所以答案是只支持一组浏览器,或者进行用户代理嗅探。

测试用例和链接:http://greenbytes.de/tech/tc2231/

答案 3 :(得分:0)

我最近对此进行了一些争论,将许多潜在的语言用于文件名(中文很适合测试)。这是我最终得到的结果(其他实施细节除外):

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))

答案 4 :(得分:0)

另外:HttpUtility被认为是有害的:
http://serialseb.blogspot.com/2008/03/httputilityurlencode-considered-harmful.html

我只是要打平并替换" "用" _"并称它为一天=)

答案 5 :(得分:0)

请注意,使用UTF编码文件名中的空格替换为' +',使用以下代码会产生相同的结果:

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)

答案 6 :(得分:0)

而不是使用 httpUtility ,用" +"替换文件名中的空格。使用以下代码解决问题:

string attachment = String.Format("attachment; filename={0}",Server.UrlPathEncode(file.Name.TrimEnd()));
Response.AddHeader("Content-Disposition", attachment);

请注意,如果您从数据集中检索文件名,则可能需要先修改名称! 您还必须提前添加以下代码行:

Response.Charset = "utf-8";
Response.HeaderEncoding = UnicodeEncoding.UTF8;
Response.ContentEncoding = UnicodeEncoding.UTF8;

答案 7 :(得分:0)

(在所有浏览器中)对我而言唯一有效的技巧是:

Dim headerFileName As String = IIf(Request.Browser.Browser = "InternetExplorer" Or Request.UserAgent.Contains("Edge"), Uri.EscapeDataString(file.Name), file.Name)
Response.AddHeader("Content-Disposition", "attachment; filename=""" + headerFileName + """")

答案 8 :(得分:0)

我们遇到了一个问题,Chrome浏览器将包含下划线的文件名更改为从中下载文件的页面的名称。

使用Furkan Ekinci在评论中建议的HttpUtility.UrlPathEncode(filename)为我们修复了问题。