欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

asp.net 上传或下载当文件名包含有特殊字符"#"的处理

程序员文章站 2024-03-08 08:06:03
如类似以下的代码: 复制代码 代码如下: uri uri = new uri(targeturl);//targeturl对应文件的绝对路径 system.net.http...
如类似以下的代码:
复制代码 代码如下:

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对应文件的绝对路径