遭遇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 问题就这样解决了。当然,如果用户上传的是一个本来就很长很长的文件名的文件,那也是没有办法的,而且数据库中设计的字段可能也没有那么长。那就要在上传的时候做好限制了。 (编辑:鲜蔬坊站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 过滤ASP.NET Core API中的属性
- asp.net – MVC4 – ContextDependentView – 这是什么意思
- asp.net – 使用umbraco的iis应用程序池使用过多的内存
- asp.net – 如何使用正则表达式将百分比验证到两位小数?
- asp.net-mvc – 如何在我自己的自定义助手中使用ASP.NET MV
- asp.net – 查询字符串参数使我的应用程序面临风险?
- asp.net – 当绑定值包含冒号时,如何绑定GridView HyperLin
- ASP.NET通过自定义函数实现对字符串的大小写切换功能
- asp.net-mvc-2 – ASP.NET MVC2 ModelMetadataProviders:重
- asp.net – 在部分视图中强制使用没有Html.BeginForm / Aja
- asp.net-mvc – 在MVC Controller中访问GET参数
- asp.net-mvc – asp.net MVC应该是View-Model封装
- asp.net – CalendarExtender定位问题
- asp.net – 使用FormsAuthentication持久的cooki
- asp.net-mvc – SelectListItem中的Selected属性
- asp.net-mvc – ASP.NET MVC模型/ ViewModel验证
- asp.net – 如何正确地大写希腊字在.NET?
- 加快ASP.NET中的构建时间
- asp.net – 未知的服务器标签’ajaxToolkit:Cal
- asp.net-mvc – 如何从mvc中的控制器中设置隐藏字