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

private void Download(string ID)
    {
        file = logic.GetAttachmentByID(new Guid(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编码输出中文名。

具体代码就是:

protected void Page_Load(object sender, EventArgs e)
{
    PostLogic logic = new PostLogic();
    if (Request.QueryString["AID"] != null)
    {
        Response.Clear();
        Encoding code = Encoding.GetEncoding("gb2312");
        Response.ContentEncoding = code;
        Response.HeaderEncoding = code;//这句很重要
        Attachment file = logic.GetAttachmentByID(new Guid(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长文件名下载的问题和解决办法相关推荐

  1. 冰点文库下载器停止工作解决办法

    冰点文库下载器停止工作解决办法 最近在使用冰点文库下载器下载文档的时候出现冰点文库下载器停止工作的问题,在下载文档之后,只要开始转换就出现提示,下面小编为大家分享解决办法! 冰点文库下载器停止工作问题 ...

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

    百度云盘上传文件和下载文件慢的解决办法 一:上传文件慢 1. 左下角点击搜索,输入cmd,右键以管理员身份运行 2. 在弹出的窗口中输入netsh interface tcp set global a ...

  3. centos 下载文件很慢_百度云盘上传文件和下载文件慢的解决办法

    百度云盘上传文件和下载文件慢的解决办法 一:上传文件慢 1. 左下角点击搜索,输入cmd,右键以管理员身份运行 2. 在弹出的窗口中输入netsh interface tcp set global a ...

  4. Deepin系统Beyond Compare下载安装以及无法使用解决办法

    Deepin系统Beyond Compare下载安装以及无法使用解决办法 前言 下载地址 安装方法 卸载方法 无法使用解决办法 前言 在工作中,因为工作环境是deepin系统比较代码用diff命令比较 ...

  5. BT下载伤硬盘的解决办法

    BT下载伤硬盘的解决办法 2010年10月30日 BT下载伤硬盘的解决办法 硬盘读写频繁是否真的伤害硬盘兼FLASHGET是否真的伤害硬盘V5版.事先说明一下,我这里只是提到FLASHGET,没有提到 ...

  6. Maven依赖下载不下来,解决办法

    一.我遇到的问题: 项目从公司私服上拉取的,有一个依赖飘红,但是没报错,项目可以正常运行,该解决的办法都试过了,请问同行大佬如何解决!!! Maven使用的阿里的镜像,在本地没有该依赖的目录,直接就是 ...

  7. The Machines 测评、下载及黑屏解决办法

    The Machines 测评.下载及黑屏解决办法 测试体验 -------------------分割线(下载链接在中间)------------------- 测试机型:MIX2s 6+64G 室 ...

  8. 马克斯cms无法下载HTTPS图片地址解决办法!

    maxcms4.0以后官方就没有更新了.现在https已经成为趋势,采集的资源站https图片无法下载到本地,那么怎么解决呢?参考:555影院修改. 马克斯无法下载HTTPS.图片解决方法: 找到网站 ...

  9. android jar 电子书下载,【Android】Gradle project sync jar包长时间下载不下来的解决办法...

    当我们新建一个Android项目,或者在项目中依赖使用一个新的第三方库时,Android Studio经常会从jcenter或者maven仓库下载jar包,但是我们的网络环境不一定一直那么的顺畅,当网 ...

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

    web程序发布后,通过浏览器访问程序显示如下的错误信息: 编译器错误消息: CS0433: 类型"ASP.global_asax"同时存在于"c:\WINDOWS\Mic ...

最新文章

  1. SSM项目spring配置文件详细步骤(分门别类、灵巧记忆)
  2. 模板:2-SAT问题
  3. centos安装python3.8
  4. 索尼PS5将配备超快速的存储设备:最快2020年2月亮相
  5. UkrGuru.SqlJson非常适合您的ASP.NET Core Web应用程序!
  6. 面试宝典系列-什么是心跳包机制
  7. 同样是OpenJDK8,有的平台需要libpng12,有的不需要
  8. osm数据下载 python_用Python编写小工具下载OSM路网数据
  9. Mac x 10.12.4 如何安装sshfs
  10. STL源码剖析(一)
  11. GWR学习笔记(一)
  12. java 解压Kmz文件selectNodes获取指定标签内容
  13. 软件测试是评价软件质量的标准吗,《软件评测师教程》读书笔记(3)-软件质量与评价(软件测试标准)...
  14. 华为手机楷体字体下载_正楷字体下载正楷字体官方下载[字体下载]-华军软件园...
  15. T61|NV显卡门|根据售后维修部数据显示爆发期来临|预防显卡门|解决显卡门
  16. 2022美团校招技术岗笔试全部AC_Code分享
  17. vc 写一个计算机功能,VC++的一个实例
  18. html 仿word页面,HTML+CSS入门 HTML页面仿WORD样式详解
  19. 《计算机网络--自顶向下方法》第三章--运输层
  20. [转载]蛋白质相互作用数据库

热门文章

  1. 【Robot Framework】字符串判断,if语句多执行条件,多执行语句
  2. HDU 4649 Professor Tian(概率DP)题解
  3. cookie的封装删除修改
  4. 使用简单的缓存提高程序执行速度
  5. ELK + Filebeat日志分析系统安装
  6. Windows 2003上 SaltStack/Salt 和 psutil 可能存在的问题及解决
  7. centreon-engine 性能调优
  8. MFC vs2012 Office2013 读写excel文件
  9. 案例:回归分析-R实现
  10. R语言可视化学习笔记之gganimate包