閱讀144 返回首頁    go 阿裏雲 go 技術社區[雲棲]


上傳或下載當文件名包含有特殊字符"#"的處理

https://www.cnblogs.com/luointer123/archive/2010/03/10/1682728.html

在上傳或下載文件時,當文件名包含有"#"特殊字符時,上傳以後的文件會被改名字,造成下載也下載不了。


如類似以下的代碼:


            Uri uri = new Uri(targetUrl);//targetUrl對應文件的絕對路徑
            System.Net.HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);


            request.Method = "PUT";
            request.Credentials = System.Net.CredentialCache.DefaultCredentials;
            request.ContentLength = stream.Length;


             文件名為:fr#32%.xls (excel附件)


上傳到服務器上,發現變成fr.xls了,文件名不對,所以就造成下載不了。


原因在於:一些 URI 包括段標識符或查詢。段標識符是 URI 中跟在數字符號 (#) 後的任何文本,存儲在 Fragment 屬性中。
查詢信息是 URI 中跟在問號 (?) 後的任何文本,存儲在 Query 屬性中。也就是說,Uri類會對文件路徑#號後麵的內容進行拆分存放。


      而且,Uri中的相關屬性也隻讀(ReadOnly)的,那麼就隻能通過其它路徑來修改了。


解決方法:


          UriBuilder 類,為統一資源標識符 (URI) 提供自定義構造函數,並修改 Uri 類的 URI。跟Uri 的功能一樣,但它的相關屬性可以進行設置。


          修改後的代碼如下: 


            Uri uri = WebHelper.ProcessSpecialCharacters(targetUrl);//targetUrl對應文件的絕對路徑
            System.Net.HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);


            request.Method = "PUT";
            request.Credentials = System.Net.CredentialCache.DefaultCredentials;
            request.ContentLength = stream.Length;


              


        /// <summary>
        /// 當上傳或下載的文件名包含有特殊字符"#"時,需要執行以下的函數進行處理
        /// </summary>
        /// <param name="Url"></param>
        /// <returns></returns>
        private static Uri ProcessSpecialCharacters(string Url)
        {
            Uri uriTarget = new Uri(Url);
            if (!Url.Contains("#"))
            {
                return uriTarget;
            }


            UriBuilder msPage = new UriBuilder();
            msPage.Host = uriTarget.Host;
            msPage.Scheme = uriTarget.Scheme;
            msPage.Port = uriTarget.Port;
            msPage.Path = uriTarget.LocalPath + uriTarget.Fragment;
            msPage.Fragment = uriTarget.Fragment;
            Uri uri = msPage.Uri;


            return uri;
        }


 


           Uri uri = new Uri(targetUrl);//targetUrl對應文件的絕對路徑

最後更新:2017-04-03 18:52:11

  上一篇:go Android 斷點續傳下載
  下一篇:go 第十一章 Hibernate的查詢 Query Language(官方推薦使用)