2011-12-18 69 views
1

我在aspnet mvc中有一個返回FileContentResult的動作。我注意到,當fileDownloadName包含元音變音(即åäöü)時,Internet Explorer根本無法讀取文件名。在IE中有效的文件名(用於下載)?

我已經試過URL編碼:

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

但後來所有的空格用加號(+)替代。

有沒有辦法讓IE工作的unicode文件名稱(保持原來的文件名稱不變)?

這是我目前使用作爲一個黑客:

return this.File(
    document.Content, 
    contentType, 
    Server.UrlEncode(document.Name).Replace('+',' ')); 

(這使得空間在IE下劃線)

回答

6
  1. UrlEncode被誤導命名,它僅適用於表單數據。你會想要UrlPathEncode,而不是解決+問題。背景請參見this question

  2. 然而,在任何情況下,URL編碼在這裏都是錯誤的,因爲您不構建URL。它在IE中工作的事實是一個錯誤,這就是爲什麼你在其他瀏覽器中得到%序列。

不幸的是,沒有可靠的跨瀏覽器的方式來獲得非ASCII字符爲Content-Disposition文件名參數。從理論上講,它可能使用RFC 2331規則,但即使如此,規範仍然存在爭議,而現實卻沒有任何支持。背景請參見this question

有沒有辦法讓IE工作的unicode文件名稱(保持原始文件名完好)?

Content-Disposition頭掉落的filename參數,而是包括文件名作爲腳本的地址,它是相當有效的使用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

+0

如果瀏覽器具有內置插件來打開該文件類型(例如-PDF),則會導致問題。在這種情況下,文件不會被保存,而是在瀏覽器內自動打開,這可能不是所需的行爲。 – 2012-05-01 13:11:26

+0

@Tom:你仍然可以傳遞一個'Content-Disposition:attachment'頭文件,只是沒有'filename'參數。 – bobince 2012-05-02 08:01:21

0

剛剛編碼的文件名,你做的方式,但隨後將所有+替換爲%20。未經測試,但應該工作。

+0

工作正常,在IE瀏覽器,但現在在Chrome瀏覽器中的文件名包含%2B所在空間以前是。 – 2011-12-18 11:58:39

+0

如何用空格替換'+'呢?這應該是允許的,因爲它是ANSI字符。你也可以嘗試在這裏的答案中提供的代碼:http://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content-disposition-header-in-http – Mario 2011-12-18 12:02:16

1

對於答覆,我使用this thread的解決方案。也許你可以嘗試使用它像

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

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

我試過了編碼的東西,在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 
    }; 

我裹成一個功能,你可以在這裏找到代碼:
http://remy.supertext.ch/2012/08/clean-filenames/

相關問題