Asp.net IE中的有效文件名(用于下载)?
我在aspnet mvc中有一个返回FileContentResult的操作。我注意到,当fileDownloadName包含umlauts(ieåäöü)时,Internet Explorer根本无法读取文件名 我尝试过以下方法:Asp.net IE中的有效文件名(用于下载)?,asp.net,asp.net-mvc,internet-explorer,http,unicode,Asp.net,Asp.net Mvc,Internet Explorer,Http,Unicode,我在aspnet mvc中有一个返回FileContentResult的操作。我注意到,当fileDownloadName包含umlauts(ieåäöü)时,Internet Explorer根本无法读取文件名 我尝试过以下方法: return this.File(document.Content, contentType, Server.UrlEncode(document.Name)); 但是所有空格都被加号(+)替换 有没有办法让unicode文件名与IE一起工作(保持原始文件名不变)
return this.File(document.Content, contentType, Server.UrlEncode(document.Name));
但是所有空格都被加号(+)替换
有没有办法让unicode文件名与IE一起工作(保持原始文件名不变)?
这就是我目前正在使用的黑客:
return this.File(
document.Content,
contentType,
Server.UrlEncode(document.Name).Replace('+',' '));
(这在IE中将空格显示为下划线)只需按照您的方式对文件名进行编码,然后将所有
+
替换为%20
。未经测试,但应能正常工作。对于我使用的解决方案。也许你可以试着像这样使用它
return this.File(
document.Content,
contentType,
"\"" + Server.UrlEncode(document.Name) + "\"");
或
UrlEncode
的名称有误导性,它仅用于表单数据。您可能希望改为使用urlpathcode
,这将解决+
问题。有关背景信息,请参阅%
-序列内容配置
文件名参数。从理论上讲,使用RFC2331规则可能是可行的,但即便如此,规范还是有争议的,事实上没有任何东西支持它。有关背景信息,请参阅
有没有办法让unicode文件名与IE一起工作(保持原始文件名不变)
从内容处置
标题中删除文件名
参数,而是将文件名作为脚本地址的尾随路径部分,在该地址中使用URL编码(UTF-8和UrlPathEncode
)非常有效。例如,对于someaction
控制器:
http://www.example.com/someaction/åäöü.txt
http://www.example.com/someaction/%C3%A5%C3%A4%C3%B6%C3%BC.txt
所有浏览器都会将生成的文件保存为
åäöü.txt
我已经尝试过编码的方法,在Chrome和FF中工作得很好,但在IE中遇到了问题。
所以我就想出了自己的清洁程序。基本上,它只是一个映射表,因为我们不想删除所有特殊字符
//http://www.pjb.com.au/comp/diacritics.html
private static string[,] CharacterReplacements = {
{ " ", "-"},
{ "&", "-"},
{ "?", "-"},
{ "!", "-"},
{ "%", "-"},
{ "+", "-"},
{ "#", "-"},
{ ":", "-"},
{ ";", "-"},
{ ".", "-"},
{ "¢", "c" }, //cent
{ "£", "P" }, //Pound
{ "€", "E" }, //Euro
{ "¥", "Y" }, //Yen
{ "°", "d" }, //degree
{ "¼", "1-4" }, //fraction one-quarter
{ "½", "1-2" }, //fraction half
{ "¾", "1-3" }, //fraction three-quarters}
{ "@", "AT)"}, //at
{ "Œ", "OE" }, //OE ligature, French (in ISO-8859-15)
{ "œ", "oe" }, //OE ligature, French (in ISO-8859-15)
{"Å","A" }, //ring
{"Æ","AE"}, //diphthong
{"Ç","C" }, //cedilla
{"È","E" }, //grave accent
{"É","E" }, //acute accent
{"Ê","E" }, //circumflex accent
{"Ë","E" }, //umlaut mark
{"Ì","I" }, //grave accent
{"Í","I" }, //acute accent
{"Î","I" }, //circumflex accent
{"Ï","I" }, //umlaut mark
{"Ð","Eth"}, //Icelandic
{"Ñ","N" }, //tilde
{"Ò","O" }, //grave accent
{"Ó","O" }, //acute accent
{"Ô","O" }, //circumflex accent
{"Õ","O" }, //tilde
{"Ö","O" }, //umlaut mark
{"Ø","O" }, //slash
{"Ù","U" }, //grave accent
{"Ú","U" }, //acute accent
{"Û","U" }, //circumflex accent
{"Ü","U" }, //umlaut mark
{"Ý","Y" }, //acute accent
{"Þ","eth"}, //Icelandic - http://en.wikipedia.org/wiki/Thorn_(letter)
{"ß","ss"}, //German
{"à","a" }, //grave accent
{"á","a" }, //acute accent
{"â","a" }, //circumflex accent
{"ã","a" }, //tilde
{"ä","ae"}, //umlaut mark
{"å","a" }, //ring
{"æ","ae"}, //diphthong
{"ç","c" }, //cedilla
{"è","e" }, //grave accent
{"é","e" }, //acute accent
{"ê","e" }, //circumflex accent
{"ë","e" }, //umlaut mark
{"ì","i" }, //grave accent
{"í","i" }, //acute accent
{"î","i" }, //circumflex accent
{"ï","i" }, //umlaut mark
{"ð","eth"}, //Icelandic
{"ñ","n" }, //tilde
{"ò","o" }, //grave accent
{"ó","o" }, //acute accent
{"ô","o" }, //circumflex accent
{"õ","o" }, //tilde
{"ö","oe"}, //umlaut mark
{"ø","o" }, //slash
{"ù","u" }, //grave accent
{"ú","u" }, //acute accent
{"û","u" }, //circumflex accent
{"ü","ue"}, //umlaut mark
{"ý","y" }, //acute accent
{"þ","eth"}, //Icelandic - http://en.wikipedia.org/wiki/Thorn_(letter)
{"ÿ","y" }, //umlaut mark
};
我已经将其包装成一个函数,您可以在这里找到代码:在IE中运行良好,但现在在chrome中,文件名包含%2b,而之前的空格是。再次将
+
替换为空格如何?这应该是允许的,因为它是ANSI字符。您还可以尝试下面的答案之一中提供的代码:如果浏览器有内置插件打开该文件类型(例如-PDFs),则会导致问题。在这种情况下,文件将不会保存,而是在浏览器中自动打开,这可能不是所需的行为。@Tom:您仍然可以传递内容处置:附件
标题,而不需要文件名
参数。
//http://www.pjb.com.au/comp/diacritics.html
private static string[,] CharacterReplacements = {
{ " ", "-"},
{ "&", "-"},
{ "?", "-"},
{ "!", "-"},
{ "%", "-"},
{ "+", "-"},
{ "#", "-"},
{ ":", "-"},
{ ";", "-"},
{ ".", "-"},
{ "¢", "c" }, //cent
{ "£", "P" }, //Pound
{ "€", "E" }, //Euro
{ "¥", "Y" }, //Yen
{ "°", "d" }, //degree
{ "¼", "1-4" }, //fraction one-quarter
{ "½", "1-2" }, //fraction half
{ "¾", "1-3" }, //fraction three-quarters}
{ "@", "AT)"}, //at
{ "Œ", "OE" }, //OE ligature, French (in ISO-8859-15)
{ "œ", "oe" }, //OE ligature, French (in ISO-8859-15)
{"Å","A" }, //ring
{"Æ","AE"}, //diphthong
{"Ç","C" }, //cedilla
{"È","E" }, //grave accent
{"É","E" }, //acute accent
{"Ê","E" }, //circumflex accent
{"Ë","E" }, //umlaut mark
{"Ì","I" }, //grave accent
{"Í","I" }, //acute accent
{"Î","I" }, //circumflex accent
{"Ï","I" }, //umlaut mark
{"Ð","Eth"}, //Icelandic
{"Ñ","N" }, //tilde
{"Ò","O" }, //grave accent
{"Ó","O" }, //acute accent
{"Ô","O" }, //circumflex accent
{"Õ","O" }, //tilde
{"Ö","O" }, //umlaut mark
{"Ø","O" }, //slash
{"Ù","U" }, //grave accent
{"Ú","U" }, //acute accent
{"Û","U" }, //circumflex accent
{"Ü","U" }, //umlaut mark
{"Ý","Y" }, //acute accent
{"Þ","eth"}, //Icelandic - http://en.wikipedia.org/wiki/Thorn_(letter)
{"ß","ss"}, //German
{"à","a" }, //grave accent
{"á","a" }, //acute accent
{"â","a" }, //circumflex accent
{"ã","a" }, //tilde
{"ä","ae"}, //umlaut mark
{"å","a" }, //ring
{"æ","ae"}, //diphthong
{"ç","c" }, //cedilla
{"è","e" }, //grave accent
{"é","e" }, //acute accent
{"ê","e" }, //circumflex accent
{"ë","e" }, //umlaut mark
{"ì","i" }, //grave accent
{"í","i" }, //acute accent
{"î","i" }, //circumflex accent
{"ï","i" }, //umlaut mark
{"ð","eth"}, //Icelandic
{"ñ","n" }, //tilde
{"ò","o" }, //grave accent
{"ó","o" }, //acute accent
{"ô","o" }, //circumflex accent
{"õ","o" }, //tilde
{"ö","oe"}, //umlaut mark
{"ø","o" }, //slash
{"ù","u" }, //grave accent
{"ú","u" }, //acute accent
{"û","u" }, //circumflex accent
{"ü","ue"}, //umlaut mark
{"ý","y" }, //acute accent
{"þ","eth"}, //Icelandic - http://en.wikipedia.org/wiki/Thorn_(letter)
{"ÿ","y" }, //umlaut mark
};