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

简介:

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

相关文章
|
11月前
|
Linux
linux命令basename:去掉路径和扩展名,得到指定文件的文件名(去除文件扩展名.xxx)
linux命令basename:去掉路径和扩展名,得到指定文件的文件名(去除文件扩展名.xxx)
126 0
7zip压缩zip格式时文件名支持中文的设置
7zip压缩zip格式时文件名支持中文的设置
82 0
7zip压缩zip格式时文件名支持中文的设置
|
Java 程序员 Maven
maven编译遇到&quot;编码GBK的不可映射字符&quot;警告的处理
maven编译会遇到&quot;编码GBK的不可映射字符&quot;的警告,来看看出了啥问题,怎么处理
147 0
maven编译遇到&quot;编码GBK的不可映射字符&quot;警告的处理
方法:怎么将手机号改成vcf格式?
第(1)步:首先你在电脑上打开软件(金芝号码提取导入助手),然后你在电脑上准备好你的号码,号码一个一行一列,把它们复制粘贴到软件的功能模块“导入通讯录”。第(2)步:然后再点软件下方的“转化通讯录”,就可以得到一个vcf文件了,也就是把号码改成了vcf格式。第(3)步:你再把这个vcf文件,从电脑上发给你的手机,在手机上打开,就可以把号码一次性导入通讯录。以上便是:怎么将手机号改成vcf格式?的方法。细节:如果你只有号码,没有姓铭,那么需要复制号码粘贴到软件上的姓铭框那里,号码作为铭字。也就是放两遍号码就可以了。
方法:怎么将手机号改成vcf格式?
为了中性含义替换man,英文可以引入拼音ren
为了中性含义替换man,英文可以引入拼音ren
80 0
|
Windows
[20161029]windows 7的文件名开头空格.txt
[20161029]windows 7的文件名开头是空格的问题.txt --今天遇到windows 7的文件名开头是空格的一个bug,通过一个例子来说明: 1.建立一个文件夹aaa: 里面包含2个文件1.txt," 1.txt", --注:第2个文件前面有一个空格要使用引号。
1535 0