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

简介:

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

相关文章
|
机器学习/深度学习 移动开发
解决mqtt连接报Connection lost (32109) - java.lang.IllegalArgumentException: Invalid UTF-8 char: [a]错误问题
最近生产环境在向mqtt客户端发布数据时反复出现一会断开一会连接错误,捕获的异常是java.lang.IllegalArgumentException: Invalid UTF-8 char: [a]。尝试各种方式都未找到问题的原因,最后在检查发送主题topic的时候发现所发送mqtt客户端的topic的结尾包含了换行符,最终才将问题得以解决。
6817 0
解决mqtt连接报Connection lost (32109) - java.lang.IllegalArgumentException: Invalid UTF-8 char: [a]错误问题
|
应用服务中间件 Linux 开发工具
CentOS7下启动Nginx出现Failed to start nginx.service:unit not found
CentOS7下启动Nginx出现Failed to start nginx.service:unit not found
4588 0
CentOS7下启动Nginx出现Failed to start nginx.service:unit not found
|
C# Windows 容器
C#或Winform中的消息通知之系统托盘的气泡提示窗口(系统toast通知)、ToolTip控件和ToolTipText属性
NotifyIcon控件表示系统右下角任务栏上的托盘图标,其ShowBalloonTip方法用于显示气球状提示框(Win10只有为本地Toast通知),ToolTip\oolTipText可以...
4082 0
C#或Winform中的消息通知之系统托盘的气泡提示窗口(系统toast通知)、ToolTip控件和ToolTipText属性
|
人工智能 自然语言处理 运维
让搜索引擎“更懂你”:AI × Elasticsearch MCP Server 开源实战
本文介绍基于Model Context Protocol (MCP)标准的Elasticsearch MCP Server,它为AI助手(如Claude、Cursor等)提供与Elasticsearch数据源交互的能力。文章涵盖MCP概念、Elasticsearch MCP Server的功能特性及实际应用场景,例如数据探索、开发辅助。通过自然语言处理,用户无需掌握复杂查询语法即可操作Elasticsearch,显著降低使用门槛并提升效率。项目开源地址:&lt;https://github.com/awesimon/elasticsearch-mcp&gt;,欢迎体验与反馈。
4172 1
echarts圆环图设置legend数据对齐百分比样式使用rich富文本标签和formatter函数
echarts圆环图设置legend数据对齐百分比样式使用rich富文本标签和formatter函数
2234 0
|
安全 Java C#
Unity多线程使用(线程池)
在C#中使用线程池需引用`System.Threading`。创建单个线程时,务必在Unity程序停止前关闭线程(如使用`Thread.Abort()`),否则可能导致崩溃。示例代码展示了如何创建和管理线程,确保在线程中执行任务并在主线程中处理结果。完整代码包括线程池队列、主线程检查及线程安全的操作队列管理,确保多线程操作的稳定性和安全性。
|
Oracle 关系型数据库 新能源
Flink CDC 在新能源制造业的实践
本文撰写自某新能源企业的研发工程师 单葛尧 老师。本文详细介绍该新能源企业的大数据平台中 CDC 技术架构选型和 Flink CDC 的最佳实践。
1097 13
Flink CDC 在新能源制造业的实践
|
存储 缓存 网络协议
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点,GET、POST的区别,Cookie与Session
计算机网络常见面试题(二):浏览器中输入URL返回页面过程、HTTP协议特点、状态码、报文格式,GET、POST的区别,DNS的解析过程、数字证书、Cookie与Session,对称加密和非对称加密
|
算法 机器人 中间件
C++的主要优势是什么?
C++的主要优势是什么?
977 1