我的應用程序允許用戶下載文件,但文件名可以採用西裏爾字母的編碼。 當用戶下載文件,我想的名字是一樣的用戶看到,但在控制器ContentDisposition不允許在西里爾編碼名稱,我嘗試將其轉換爲 UTF-8。 瀏覽器,IE和Opera下載使用正確的文件的文件名:
Firefox和Safari像這樣的東西asp.net的MVC文件下載名稱編碼
我的控制器:
public ActionResult Download()
{
var name = Request.Params["Link"];
var filename = Request.Params["Name"];
filename = GetCleanedFileName(filename);
var cd = new ContentDisposition
{
FileName = filename,
Inline = false,
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(name, "application/file");
}
public static string GetCleanedFileName(string s)
{
char[] chars = s.ToCharArray();
StringBuilder sb = new StringBuilder();
for (int index = 0; index < chars.Length; index++)
{
string encodedString = EncodeChar(chars[index]);
sb.Append(encodedString);
}
return sb.ToString();
}
private static string EncodeChar(char chr)
{
UTF8Encoding encoding = new UTF8Encoding();
StringBuilder sb = new StringBuilder();
byte[] bytes = encoding.GetBytes(chr.ToString());
for (int index = 0; index < bytes.Length; index++)
{
if (chr > 127)
sb.AppendFormat("%{0}", Convert.ToString(bytes[index], 16));
else
sb.AppendFormat("{0}", chr);
}
return sb.ToString();
}
的可能重複的[如何在HTTP內容處理標頭的文件名參數編碼?](http://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content -disposition集管中-HTTP)。在閱讀這個重複問題中的答案之後,您將意識到問題的嚴重程度,並且可能會簡單地將您的文件重命名爲僅在其名稱中使用ASCII字符。 –
不幸的是我無法重命名文件。 –
那麼,祝你好運閱讀說明書:http://greenbytes.de/tech/webdav/rfc5987.html哦,當然,如果你需要支持不符合本規範的瀏覽器,那麼,你將不得不分別處理它們(並且針對您想要支持的每個瀏覽器和版本)。另一種可能性是將文檔壓縮成帶有ASCII名稱的.zip文件,您將流式傳輸到客戶端,而其內部將是名稱中包含任何字符的實際文檔。 –