asp.Netアップロードまたはダウンロードファイル名に特殊文字「#」が含まれている場合の処理

1934 ワード

次のようなコードがあります.
 
  
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;
///
/// "#" ,
///

///
///
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