时间:2021-07-01 10:21:17 帮助过:9人阅读
- <br>Uri uri = new Uri(targetUrl);//targetUrl对应文件的绝对路径 <br>System.Net.HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); <br>request.Method = "PUT"; <br>request.Credentials = System.Net.CredentialCache.DefaultCredentials; <br>request.ContentLength = stream.Length; <br> <br>文件名为:fr#32%.xls (excel附件) <br>上传到服务器上,发现变成fr.xls了,文件名不对,所以就造成下载不了。 <br>原因在于:一些 URI 包括段标识符或查询。段标识符是 URI 中跟在数字符号 (#) 后的任何文本,存储在 Fragment 属性中。 <br>查询信息是 URI 中跟在问号 (?) 后的任何文本,存储在 Query 属性中。也就是说,Uri类会对文件路径#号后面的内容进行拆分存放。 <br>而且,Uri中的相关属性也只读(ReadOnly)的,那么就只能通过其它路径来修改了。 <br>解决方法: <br>UriBuilder 类,为统一资源标识符 (URI) 提供自定义构造函数,并修改 Uri 类的 URI。跟Uri 的功能一样,但它的相关属性可以进行设置。 <br>修改后的代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br><span><u></u></span> 代码如下:<pre class="brush:php;toolbar:false layui-box layui-code-view layui-code-notepad"><ol class="layui-code-ol"><li><br>Uri uri = WebHelper.ProcessSpecialCharacters(targetUrl);//targetUrl对应文件的绝对路径 <br>System.Net.HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); <br>request.Method = "PUT"; <br>request.Credentials = System.Net.CredentialCache.DefaultCredentials; <br>request.ContentLength = stream.Length; <br>/// <summary> <br>/// 当上传或下载的文件名包含有特殊字符"#"时,需要执行以下的函数进行处理 <br>/// </summary> <br>/// <param name="Url"></param> <br>/// <returns></returns> <br>private static Uri ProcessSpecialCharacters(string Url) <br>{ <br>Uri uriTarget = new Uri(Url); <br>if (!Url.Contains("#")) <br>{ <br>return uriTarget; <br>} <br>UriBuilder msPage = new UriBuilder(); <br>msPage.Host = uriTarget.Host; <br>msPage.Scheme = uriTarget.Scheme; <br>msPage.Port = uriTarget.Port; <br>msPage.Path = uriTarget.LocalPath + uriTarget.Fragment; <br>msPage.Fragment = uriTarget.Fragment; <br>Uri uri = msPage.Uri; <br>return uri; <br>} <br>Uri uri = new Uri(targetUrl);//targetUrl对应文件的绝对路径 <br></li><li> </li><li> </li></ol></pre></li></ol></pre>