遭遇Asp.Net长文件名下载的问题和解决办法
在Asp.Net中写了一个附件上传和下载的程序,附件上传到数据库中,然后将附件的GUID保存起来,我们可以根据GUID来找到数据库中的附件,一般附件下载的代码是: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> 这里比较重要的就是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编码输出中文名。 具体代码就是: Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --> 这样输出的就是长中文名了。我们再来抓包看一下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 问题就这样解决了。当然,如果用户上传的是一个本来就很长很长的文件名的文件,那也是没有办法的,而且数据库中设计的字段可能也没有那么长。那就要在上传的时候做好限制了。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 什么是最好的.NET库的OpenID和ASP.NET MVC?
- asp.net-mvc – MVC 3.0编辑可变长度列表并使用PRG模式
- asp.net-mvc-3 – 为什么会话是ASP.NET MVC应用程序的灾难?
- asp.net-mvc – 使用EF Code First和ASP.NET MVC部分更新对
- ASP.NET 4 URL路由Web表单打破了我对样式,脚本,图像等的相对
- ASP.NET会话状态在异常后丢失
- ASP.NET从URL获取物理文件路径
- asp.net – 渗透测试人员说.ASPXAUTH cookie是不安全的并且
- asp.net – 如何在asp标签中将文本与中心对齐
- asp.net-mvc – 为什么在ASP.NET MVC 3中,默认路由不适用于
- asp.net-mvc – MVC3 Actionlink重定向到错误的控
- ASP.NET 判断微信浏览器
- ASP.Net:将客户端onClick添加到GridView中的Hyp
- 帮助页面ASP.NET vNext MVC 6 Web Api
- AntiXss.HtmlEncode vs AntiXss.GetSafeHtmlFrag
- ASP.NET C#将用户添加/更新到角色
- 页面刷新导致ASP.NET应用程序中重复的POST
- asp.net-mvc-2 – 如何让HandleErrorAttribute与
- object – 经典ASP – 何时关闭记录集
- asp.net-mvc-3 – Azure网站上的RavenDb – 访问