asp.net 上传或下载当文件名包含有特殊字符"#"的处理
更新时间:2010年03月10日 22:57:30 作者:
在上传或下载文件时,当文件名包含有"#"特殊字符时,上传以后的文件会被改名字,造成下载也下载不了。
如类似以下的代码:
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对应文件的绝对路径
复制代码 代码如下:
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对应文件的绝对路径
相关文章
在.Net Framework应用中请求HTTP2站点的问题解析
随着各大浏览器支持和苹果的带头效应,HTTP2的应用会越来越广泛,但是规模庞大的.NET Framework应用却也不能为了连接HTTP2就升级到NET Core平台。通过本文提供的方案,可以最小成本的实现.NET Framework应用成功访问HTTP2站点,感兴趣的朋友跟随小编一起看看吧2022-07-07自写一个模仿Dictionary与Foreach的实现及心得总结
利用闲暇时间自己写一个类模仿Dictionary实现,如果一个类进行foreach的话,该类必须实现IEnumerable,集合要支持foreach方式的遍历,必须实现IEnumerable接口,感兴趣的你可不要错过了哈2013-02-02"PageMethods未定义"或"对象不支持此属性或方法"解决方法分享
PageMethods未定义或对象不支持此属性或方法解决方法,需要的朋友可以参考下。2010-12-12使用aspnet_regiis.exe重新注册.NET Framework
本文主要介绍使用aspnet_regiis.exe重新注册.NET Framework的方法,简单实用,有需要的朋友拿去用吧。2016-05-05ASP.NET实现MVC中获取当前URL、controller及action的方法
这篇文章主要介绍了ASP.NET实现MVC中获取当前URL、controller及action的方法,结合实例形式分析了asp.net mvc获取当前URL、controller及action的具体实现技巧,需要的朋友可以参考下2017-02-02.NET6 ConfigurationManager的实现及使用方式
这篇文章主要介绍了.NET6 ConfigurationManager的实现,我们上面展示的这一部分的ConfigurationManager代码,其实就是替代了原来的ConfigurationBuilder类的功能,需要的朋友可以参考下2021-12-12
最新评论