2011-11-03 17 views
1

我的應用程序允許用戶下載文件,但文件名可以採用西裏爾字母的編碼。 當用戶下載文件,我想的名字是一樣的用戶看到,但在控制器ContentDisposition不允許在西里爾編碼名稱,我嘗試將其轉換爲 UTF-8。 瀏覽器,IE和Opera下載使用正確的文件的文件名:

enter image description here Firefox和Safari像這樣的東西asp.net的MVC文件下載名稱編碼


enter image description here

我的控制器:

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(); 
     } 
+0

的可能重複的[如何在HTTP內容處理標頭的文件名參數編碼?](http://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content -disposition集管中-HTTP)。在閱讀這個重複問題中的答案之後,您將意識到問題的嚴重程度,並且可能會簡單地將您的文件重命名爲僅在其名稱中使用ASCII字符。 –

+0

不幸的是我無法重命名文件。 –

+0

那麼,祝你好運閱讀說明書:http://greenbytes.de/tech/webdav/rfc5987.html哦,當然,如果你需要支持不符合本規範的瀏覽器,那麼,你將不得不分別處理它們(並且針對您想要支持的每個瀏覽器和版本)。另一種可能性是將文檔壓縮成帶有ASCII名稱的.zip文件,您將流式傳輸到客戶端,而其內部將是名稱中包含任何字符的實際文檔。 –

回答