Asp.Net长文件名下载的问题和解决办法

在Asp.Net中写了一个附件上传和下载的程序,附件上传到数据库中,然后将附件的GUID保存起来,我们可以根据GUID来找到数据库中的附件,一般附件下载的代码是:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->privatevoidDownload(stringID)
{
file=logic.GetAttachmentByID(newGuid(ID));
Response.AddHeader("Content-Type",file.Type);
Response.AppendHeader("Content-Disposition","attachment;filename=\""+HttpUtility.UrlEncode(file.FileName)+"\"");
Response.BinaryWrite(file.Data.ToArray());
Response.End();
}

这里比较重要的就是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编码输出中文名。

具体代码就是:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->protectedvoidPage_Load(objectsender,EventArgse)
{
PostLogiclogic=newPostLogic();
if(Request.QueryString["AID"]!=null)
{
Response.Clear();
Encodingcode=Encoding.GetEncoding("gb2312");
Response.ContentEncoding=code;
Response.HeaderEncoding=code;//这句很重要
Attachmentfile=logic.GetAttachmentByID(newGuid(Request.QueryString["AID"].ToString()));
Response.AddHeader("Content-Type",file.Type);
Response.AppendHeader("Content-Disposition","attachment;filename=\""+file.FileName+"\"");//这里不进行编码工作,直接输出中文字符串
Response.BinaryWrite(file.Data.ToArray());
Response.End();
}
}

这样输出的就是长中文名了。我们再来抓包看一下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长文件名下载的问题和解决办法

时间: 2024-10-10 07:17:35

Asp.Net长文件名下载的问题和解决办法的相关文章

[.net] 关于CS0016: Could not write to output file ‘c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files… ‘Access is denied.’ 的解决办法

[.net] 关于CS0016: Could not write to output file ‘c:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\Temporary ASP.NET Files… ‘Access is denied.’ 的解决办法 1.添加用户"Network Service” 和 “IIS_IUSERS” 读下面目录的读写权限 a) C:\Windows\Temp b) C:\Windows\Microsoft.NET\Framewo

百度云盘上传文件和下载文件慢的解决办法

百度云盘上传文件和下载文件慢的解决办法 一:上传文件慢 1. 左下角点击搜索,输入cmd,右键以管理员身份运行 2. 在弹出的窗口中输入netsh interface tcp set global autotuning=disabled,回车可看到确定,代表执行成功.再继续在命令行中输入regedit,回车即打开注册表编辑器. 3. 进入注册表界面 路径:HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\services\AFD,找到文件名为Parameters的文

.net 发布程序时出现“类型ASP.global_asax同时存在于...”错误的解决办法

web程序发布后,通过浏览器访问程序显示如下的错误信息: 编译器错误消息: CS0433: 类型“ASP.global_asax”同时存在于“c:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\Temporary ASP.NET Files\root\53b6b4c0\fd28ca79\assembly\dl3\5e116b20\5071ece6_c2e1c901\App_global.asax.DLL”和“c:\WINDOWS\Microsoft.NET

近期ASP.NET问题汇总及对应的解决办法

1. 使用SQL统计一个字符串中指定字符的个数,示例(统计0的个数): select len('402301001') - len(replace('402301001','0','')) 2. 使用Forms认证,客户端本地时间不对无法登陆系统,解决办法: FormsAuthentication.RedirectFromLoginPage第二个参数设置成false,MSDN资料:http://msdn.microsoft.com/zh-cn/library/ka5ffkce(v=vs.110)

electron下载/打包慢?解决办法.....

由于众所周知的原因,国内的程序员开发electron程序的时候,面临的首要问题就是各种timeout,以及打包很慢的问题,解决办法是直接修改配置文件: npm config edit 在文件最后面处添加:(修改为淘宝镜像) registry=https://registry.npm.taobao.org/ ELECTRON_MIRROR=http://npm.taobao.org/mirrors/electron/ 原文地址:https://www.cnblogs.com/GeGeBoom/p/

GitHub克隆下载代码速度慢解决办法

这几天克隆下载GitHub代码奇慢无比,网上搜索了一下解决方案有些不太完整,自己试验出了比较完整的解决方式: 1.在hosts文件里追加以下内容(IP需要替换掉),以下5个域名一个都不要少,有些文章只写了一部分,我一开始就少了个github.com,结果速度就还是很慢. 151.101.109.194 github.global.ssl.fastly.net185.199.110.153 assets-cdn.github.com151.101.108.133 avatars0.githubus

关于Genymotion下载比较慢的解决办法

Genymotion号称Android模拟器中运行最快的,但是服务器在国外,Android镜像下载起来那个速度就不想说了. Add new device后下载速度太慢了,容易失败 先登录,然后add,选择对应的版本开始下载,这时候比较慢,打开C:\Users\自己用户名\AppData\Local\Genymobile\genymotion,用文本编辑器打开,就可以看到有Downloading file....后面的ova文件,复制链接,放入迅雷或者qq旋风,进行快速 这里提供两个我2016年1

记录-Maven下载jar包失败解决办法

maven从nexsu上面拉jar包,有时会因为网络问题导致下不了包,这时候文件夹内会个*lastUpdated.properties的文件,而这文件的存在会导致下次服务器不会去下载这个包,这时候要删掉这个文件才能让maven再次去下载.以下分别是windows下和linux下的批量删除该文件命令: Java代码   del D:\java\maven\maven2_repository\*lastUpdate* /a/s Java代码   find ./ -name "*lastUpdated

通过Android SDK Manager无法下载SDK的一个解决办法

在SDK Manager下Tools->Options, 按下图填写, 这个代理不稳定, 有时要多重试几次才能下载, 不过聊胜于无 sdk.gdgshanghai.com 8000