在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 解决下载文件的时候文件名乱码问题,
彻底解决Asp.net 文件下载时文件名的中文乱码和空格异常全球性技术难题
自已做的前台asp.net后台C#做的工时统计管理系统遇到的问题及解决办法,是一些典型的问题及解决办法,我在遇到这些问题时,查询了大量资料,最后成功实现功能后总结的文档。
ASP.NET解决方法 1、自动附加到计算机“计算机名”上的进程“[四位的一个编号] aspnet_wp.exe”失败。错误代码为 0x8013134b。 因为ASP.NET运行时,发出的HTTP请求经过IIS,然后由IIS再专访给aspnet_wp.exe进行处理...
ASP.NET 长连接做得在线聊天例子 一些尝试
ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP.NET入门经典ASP...
asp.net源代码下载asp.net源代码下载asp.net源代码下载asp.net源代码下载asp.net源代码下载asp.net源代码下载asp.net源代码下载asp.net源代码下载asp.net源代码下载
【ASP.NET编程知识】ASP.NET之Excel下载模板、导入、导出操作.docx
通常情况下,在asp.net做下载功能 只需要做成一个链接就可以了,但是对于图片这种情况,却不能那样实现,因为点击图片时,会在浏览器中直接打开。 这个项目中包含了图片下载的代码。请各位借鉴
asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程asp.net教程...
ASP.NET实例下载ASP.NET实例下载ASP.NET实ASP.NET实例下载例下载ASP.NET实例下载ASP.NET实例下载
asp.net关于时间的相关问题解决办法.......
这是第六版的介绍《ASP.NET 4入门经典:涵盖C#和VB.NET(第6版)》内容简介:ASP.NET是.NET Framework的一部分,用于构建内容丰富的动态Web站点。其最新的版本ASP.NET 4对上一版进行了许多改进,包括增强了Web窗体,并...
每一章内容分别解决企业ASP.NET应用程序中的一个层,同时讲解如何运用经过证明的模式、原则和最佳实践来解决问题、改进代码设计。此外,《ASP.NET设计模式》还使用一个专业级的、从头到尾的完整案例研究来演示如何在...
在 W3School,我们提供完整的 ASP.NET 参考手册,其中包括内建对象和组件,以及它们的属性和方法。 ASP.NET 实例 ASP.NET 实例 一系列的 ASP.NET 实例。 内容目录 ASP.NET 简介 本章解释 ASP.NET 的概念。 ASP...
ASP.NET应注意知识点及解决方案,ASP.NET应注意知识点及解决方案
asp.net 2.0 插件下载 C# vs2008 asp.net 2.0
ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP.net实战项目ASP...
Asp.net多线程下载示例源码 (包含完整的CS文件!) <br>1. 支持多线程: 多个线程某时刻下载同一个文件的不同块. 2. 断点续传: 如果下载了一个文件的某些块(一半), 则下次下载时只需下载未完成的块;文件块的...