2009-10-21 78 views
16

當文件名是「Algunas MARCAS que nosacompañan」時,當我嘗試下載該文件時,ASP.NET MVC引發了一個System.FormatException。但如果文件名是「Asistente de Gerencia Comercial」,它不會。如何對文件名進行編碼下載?

我想這是因爲與UTF-8編碼有關,但我不知道如何編碼該字符串。

如果我是正確的,我怎樣才能編碼字符串在UTF-8編碼?如果我不對,我的問題是什麼?

+0

您現在如何將文件發送回用戶?使用'System.Web.Mvc.FileResult'?你能發佈你的代碼嗎? – 2009-10-21 02:33:36

+0

是的,我正在使用FileResult。 – eKek0 2009-10-21 02:40:01

+0

奇怪的是'System.Web.Mvc.FileResult'在內部使用'System.Net.Mime.ContentDisposition'來生成它添加到響應中的頭部。我希望這個類能夠處理任何字符串編碼對於這項工作是必要的。 – 2009-10-21 03:10:00

回答

22

我編碼的文件名這樣的下載,基於ZZ編碼器答案

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

這用+代替空格,這可能不是你想要的。 – Cosmin 2014-10-14 12:39:26

+2

**注意**:對於現代的正確解決方案,請參閱RFC6266:http://tools.ietf.org/html/rfc6266 – 2016-02-25 17:11:16

5

,因爲我使用FileResult,我決定將文件名編碼爲:

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

我最近與這個爭鬥了一下,有很多潛在的語言被用於文件名(中文很好測試)。這裏是接近我結束了什麼(其他實施細節除外):

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

此問題已爲人所知多年。據我所知,目前沒有可互操作的方式來做到這一點,所以答案是隻支持一組瀏覽器,或者做User Agent嗅探。

測試用例,並在鏈接:http://greenbytes.de/tech/tc2231/

0

注意使用UTF編碼取代在文件名中的空格到「+」,使用下列代碼產生相同的結果:

HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1")) 
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8) 
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; 
相關問題