當文件名是「Algunas MARCAS que nosacompañan」時,當我嘗試下載該文件時,ASP.NET MVC引發了一個System.FormatException
。但如果文件名是「Asistente de Gerencia Comercial」,它不會。如何對文件名進行編碼下載?
我想這是因爲與UTF-8
編碼有關,但我不知道如何編碼該字符串。
如果我是正確的,我怎樣才能編碼字符串在UTF-8
編碼?如果我不對,我的問題是什麼?
當文件名是「Algunas MARCAS que nosacompañan」時,當我嘗試下載該文件時,ASP.NET MVC引發了一個System.FormatException
。但如果文件名是「Asistente de Gerencia Comercial」,它不會。如何對文件名進行編碼下載?
我想這是因爲與UTF-8
編碼有關,但我不知道如何編碼該字符串。
如果我是正確的,我怎樣才能編碼字符串在UTF-8
編碼?如果我不對,我的問題是什麼?
我編碼的文件名這樣的下載,基於ZZ編碼器答案
HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename= " + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
這用+代替空格,這可能不是你想要的。 – Cosmin 2014-10-14 12:39:26
**注意**:對於現代的正確解決方案,請參閱RFC6266:http://tools.ietf.org/html/rfc6266 – 2016-02-25 17:11:16
,因爲我使用FileResult,我決定將文件名編碼爲:
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)
我最近與這個爭鬥了一下,有很多潛在的語言被用於文件名(中文很好測試)。這裏是接近我結束了什麼(其他實施細節除外):
HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))
此問題已爲人所知多年。據我所知,目前沒有可互操作的方式來做到這一點,所以答案是隻支持一組瀏覽器,或者做User Agent嗅探。
測試用例,並在鏈接:http://greenbytes.de/tech/tc2231/
另外:HttpUtility認爲是有害的:
http://serialseb.blogspot.com/2008/03/httputilityurlencode-considered-harmful.html
我只是踢和替換 「」 與 「_」 和收工=)
注意使用UTF編碼取代在文件名中的空格到「+」,使用下列代碼產生相同的結果:
HttpUtility.UrlEncode("é", System.Text.Encoding.GetEncoding("ISO-8859-1"))
HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8)
而是採用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;
您現在如何將文件發送回用戶?使用'System.Web.Mvc.FileResult'?你能發佈你的代碼嗎? – 2009-10-21 02:33:36
是的,我正在使用FileResult。 – eKek0 2009-10-21 02:40:01
奇怪的是'System.Web.Mvc.FileResult'在內部使用'System.Net.Mime.ContentDisposition'來生成它添加到響應中的頭部。我希望這個類能夠處理任何字符串編碼對於這項工作是必要的。 – 2009-10-21 03:10:00