当文件名是“Algunas MARCAS quenosacompañan”时,当我尝试下载该文件时,ASP.NET MVC会引发System.FormatException
。但如果文件名是“Asistente de Gerencia Comercial”则不然。
我想这是因为与UTF-8
编码相关的内容,但我不知道如何编码该字符串。
如果我是对的,我如何用UTF-8
编码对字符串进行编码?如果我不对,我的问题是什么?
答案 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)
这个问题多年来一直为人所知。据我所知,目前没有可互操作的方法,所以答案是只支持一组浏览器,或者进行用户代理嗅探。
答案 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)
为我们修复了问题。