Asp.net IE中的有效文件名(用于下载)?

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一起工作(保持原始文件名不变)

我在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).Replace('+',' '));

(这在IE中将空格显示为下划线)

只需按照您的方式对文件名进行编码,然后将所有
+
替换为
%20
。未经测试,但应能正常工作。

对于我使用的解决方案。也许你可以试着像这样使用它

return this.File(
  document.Content,
  contentType,
  "\"" + Server.UrlEncode(document.Name) + "\"");

  • UrlEncode
    的名称有误导性,它仅用于表单数据。您可能希望改为使用
    urlpathcode
    ,这将解决
    +
    问题。有关背景信息,请参阅

  • 然而,无论如何,URL编码在这里都是错误的,因为您没有构建URL。它在IE中工作的事实是一个bug,这就是为什么在其他浏览器中会出现
    %
    -序列

  • 不幸的是,没有可靠的跨浏览器方法将非ASCII字符放入
    内容配置
    文件名参数。从理论上讲,使用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
        };