遭遇Asp.Net长文件名下载的问题和解决办法
在Asp.Net中写了一个附件上传和下载的程序,附件上传到数据库中,然后将附件的GUID保存起来,我们可以根据GUID来找到数据库中的附件,一般附件下载的代码是: 这里比较重要的就是Response.AppendHeader("Content-Disposition","attachment; filename="" + HttpUtility.UrlEncode(file.FileName) + """);这里需要对中文文件名进行编码,默认是使用的UTF8编码。但是编码后文件名就会变得很长,比如我现在有一个文件叫: 招标送检样机项目检查登记表(终端)-空.XLS 我们进行网络抓包,可以看到在下载文件的时候的HTTP响应是: HTTP/1.1 200 OK Cache-Control: private Content-Length: 44032 Content-Type: application/vnd.ms-excel Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET MicrosoftSharePointTeamServices: 12.0.0.6219 X-AspNet-Version: 2.0.50727 Content-Disposition: attachment; filename="%e6%8b%9b%e6%a0%87%e9%80%81%e6%a3%80%e6%a0%b7%e6%9c%ba%e9%a1%b9%e7%9b%ae%e6%a3%80%e6%9f%a5%e7%99%bb%e8%ae%b0%e8%a1%a8(%e7%bb%88%e7%ab%af)-%e7%a9%ba.XLS" Date: Wed,25 Mar 2009 08:00:26 GMT 可以得到编码后文件名变成了:%e6%8b%9b%e6%a0%87%e9%80%81%e6%a3%80%e6%a0%b7%e6%9c%ba%e9%a1%b9%e7%9b%ae%e6%a3%80%e6%9f%a5%e7%99%bb%e8%ae%b0%e8%a1%a8(%e7%bb%88%e7%ab%af)-%e7%a9%ba.XLS 这都是在HTTP头里面的,由于浏览器或者其他原因,对于这么长的HTTP头,系统会对字符串进行截止,那么就会造成下载的时候文件名不全或者干脆就是乱码的情况。我试了一下,这个文件的下载在IE8里面是完全正常的,但是在IE6里面就会造成字符串截止,变成“%a0%87送检样机项目检查登记表(终端)-空.XLS”。不同的浏览器截止的还不同。 解决办法有2种,1种是限制用户上传的文件的文件名或者我们在下载的时候写代码对文件名进行截止,避免出现乱码的情况,但是这样造成的用户体验并不好。那就用第2种解决办法:不使用UTF8的UrlEncode编码,直接使用gb2312编码输出中文名。 具体代码就是: 这样输出的就是长中文名了。我们再来抓包看一下HTTP响应的头: HTTP/1.1 200 OK Cache-Control: private Content-Length: 44032 Content-Type: application/vnd.ms-excel Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET MicrosoftSharePointTeamServices: 12.0.0.6219 X-AspNet-Version: 2.0.50727 Content-Disposition: attachment; filename="招标送检样机项目检查登记表(终端)-空.XLS" Date: Wed,25 Mar 2009 09:04:34 GMT 问题就这样解决了。当然,如果用户上传的是一个本来就很长很长的文件名的文件,那也是没有办法的,而且数据库中设计的字段可能也没有那么长。那就要在上传的时候做好限制了。 (编辑:岳阳站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 用ADO.NET处理层次数据
- ASP.NET JSON字符串与实体类的互转换示例代码
- 如何排序. .NET中的resx(资源文件)
- asp.net下使用jquery 的ajax+WebService+json 实现无刷新取
- asp.net – 防止TextBox中的特殊字符
- asp.net-mvc – ASP.NET MVC 3列表到IEnumerable
- asp.net-mvc – 如何设置AntiForgeryToken cookie路径
- asp.net-mvc – Ajax.BeginForm和验证
- asp.net 读取xml文件里面的内容,绑定到dropdownlist中
- asp.net-mvc-4 – 如何在Kendo UI Grid中扩展页面加载时的所
- asp.net-mvc-routing – 在MVC 6控制器中使用url
- asp.net – 通过邮件发送wcf服务消费表单数据
- asp.net-mvc – 我可以获取html.HiddenFor / Htm
- 在asp.net mvc2项目中不需要MS脚本的JQuery验证
- asp.net – 增加IIS7 / Win7 Pro上的最大上传文件
- asp.net-mvc – ASP.NET MVC:处理取消按钮的正确
- asp.net – UpdatePanel中的动态创建控件?
- asp.net jQuery Ajax用户登录功能的实现
- 谈谈.NET Core中基于Generic Host来实现后台任务
- asp.net – 有谁知道如何摆脱我的.net网络服务的