仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 707|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计asp.net完成文件下载的代码

[复制链接]
简单生活 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:19:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
以前学了大概半年时间的asp(没有机会做大系统,最多是自己对公司系统做些调整和修改还有一些小程序)。应该说开始接触asp.net是今年元月5号的事。现在很想把公司的系统重新用.net来架构,却不知道如何下手。复制代码代码以下:
publicpartialclassFileDownLoad:System.Web.UI.Page
{
//供应下载的文件,不编码的话文件名会乱码
privatestringfileName=HttpContext.Current.Server.UrlEncode("标准.rar");
privatestringfilePath=HttpContext.Current.Server.MapPath("标准.rar");
//利用TransmifFile下载文件
protectedvoidbtnDL1_Click(objectsender,EventArgse)
{
FileInfoinfo=newFileInfo(filePath);
longfileSize=info.Length;
Response.Clear();
Response.ContentType="application/x-zip-compressed";
Response.AddHeader("Content-Disposition","attachment;filename="+fileName);
//不指明Content-Length用Flush的话不会显现下载进度
Response.AddHeader("Content-Length",fileSize.ToString());
Response.TransmitFile(filePath,0,fileSize);
Response.Flush();
Response.Close();
}

//利用WriteFile下载文件
protectedvoidbtnDL2_Click(objectsender,EventArgse)
{
FileInfoinfo=newFileInfo(filePath);
longfileSize=info.Length;
Response.Clear();
Response.ContentType="application/octet-stream";
Response.AddHeader("Content-Disposition","attachement;filename="+fileName);
//指定文件巨细
Response.AddHeader("Content-Length",fileSize.ToString());
Response.WriteFile(filePath,0,fileSize);
Response.Flush();
Response.Close();
}

//利用OutputStream.Write分块下载文件
protectedvoidbtnDL3_Click(objectsender,EventArgse)
{
//指定块巨细
longchunkSize=102400;
//创建一个100K的缓冲区
byte[]buffer=newbyte[chunkSize];
//已读的字节数
longdataToRead=0;
FileStreamstream=null;
try
{
//翻开文件
stream=newFileStream(filePath,FileMode.Open,FileAccess.Read,FileShare.Read);
dataToRead=stream.Length;

//增加Http头
Response.ContentType="application/octet-stream";
Response.AddHeader("Content-Disposition","attachement;filename="+fileName);
Response.AddHeader("Content-Length",dataToRead.ToString());

while(dataToRead>0)
{
if(Response.IsClientConnected)
{
intlength=stream.Read(buffer,0,Convert.ToInt32(chunkSize));
Response.OutputStream.Write(buffer,0,length);
Response.Flush();
Response.Clear();
dataToRead-=length;
}
else
{
//避免client得到毗连
dataToRead=-1;
}
}
}
catch(Exceptionex)
{
Response.Write("Error:"+ex.Message);
}
finally
{
if(stream!=null)
{
stream.Close();
}
Response.Close();
}
}

//利用BinaryWrite下载文件,年夜文件效力不可
protectedvoidbtnDL4_Click(objectsender,EventArgse)
{
FileStreamstream=null;
try
{
//读文件,年夜文件一次读进会占用大批内存
stream=newFileStream(filePath,FileMode.Open,FileAccess.Read,FileShare.Read);
byte[]bytes=newbyte[stream.Length];
stream.Read(bytes,0,bytes.Length);
stream.Close();

//增加Http头
Response.ContentType="application/octet-stream";
Response.AddHeader("Content-Disposition","attachement;filename="+fileName);
Response.AddHeader("Content-Length",bytes.Length.ToString());
Response.BinaryWrite(bytes);
Response.Flush();
}
catch(Exceptionex)
{
Response.Write("Error:"+ex.Message);
}
finally
{
if(stream!=null)
{
stream.Close();
}
Response.Close();
}
}
//利用BinaryWrite分块下载文件
protectedvoidbtnDL5_Click(objectsender,EventArgse)
{
//指定区块弛缓冲区
longchunkSize=102400;
byte[]buffer=newbyte[chunkSize];
FileStreamstream=null;
longdataToRead=0;
try
{
stream=newFileStream(filePath,FileMode.Open,FileAccess.Read,FileShare.Read);
dataToRead=stream.Length;
//增加Http头
Response.ContentType="application/octet-stream";
Response.AddHeader("Content-Disposition","attachement;filename="+fileName);
Response.AddHeader("Content-Length",dataToRead.ToString());

while(dataToRead>0)
{
if(Response.IsClientConnected)
{
intlength=stream.Read(buffer,0,Convert.ToInt32(chunkSize));
Response.BinaryWrite(buffer);
Response.Flush();
Response.Clear();

dataToRead-=length;
}
else
{
dataToRead=-1;
}
}

}
catch(Exceptionex)
{
Response.Write("Error:"+ex.Message);
}
finally
{
if(stream!=null)
{
stream.Close();
}
Response.Close();
}
}
}

以上除第四种不保举之外,其他的都能够,可是团体感到分块下载的要好一点。没有细心测试,以是大概有成绩。

注重:关于中文文件名要编码才干准确显现。关于长中文文件名(UTF8编码后年夜于153字节的中文)即便编码了,仍是有成绩的,人人能够参考上面的文章。

关于中文文件下载的成绩,网上的征询和答疑已良多,我本来处置下载的代码以下:

response.setHeader("Content-Disposition","attachment;filename="+java.net.URLEncoder.encode(fileName,"UTF-8"));
下载的程序里有了这句,一样平常在IE6的下载提醒框大将准确显现文件的名字,不管是简体中文,仍是日文。不外事先的确没有细心测试文件名很长的中文文件名。先现在经由细心测试,发明笔墨只需凌驾17个字,就不克不及下载了。经由好一番google和重复测试,总算对这个成绩有了体系的熟悉,排列以下:

一.经由过程我本来的体例,也就是先用URLEncoder编码,傍边文笔墨凌驾17个时,IE6没法下载文件。这是IE的bug,拜见微软的常识库文章KB816868。缘故原由多是由于ie在处置ResponseHeader的时分,对header的长度限定在150字节摆布。而一个汉字编码成UTF-8是9个字节,那末17个字即是153个字节,以是便会报错。微软供应了一个补钉,能够从这里下载。这个补钉必要先安装ie6sp1。由于我平常勤打补钉,我的IE6版本号是6.0.2800.1106.xpsp2_xxxxx。以是我大概已安装过了补钉,从而能够下载,但仍旧呈现文件名被截断的征象。微软让我们守候IE下一个servicepack的公布。我明天也上彀看到了好动静,迫于firefox的压力,IE7大概在年中公布。别的,Firefox不撑持如许的体例,将把编码后的%xx%xx间接作为文件名显现。


二.我实验利用javamail的MimeUtility.encode()办法来编码文件名,也就是编码成=?gb2312?B?xxxxxxxx?=如许的情势,并从RFC1522中找到对应的尺度撑持。不外很遗憾,IE6其实不撑持这一个尺度。我试了一下,Firefox是撑持的。

三.按网上良多人供应的办理计划:将文件名编码成ISO8859-1仿佛是无效的办理计划,代码以下:

response.setHeader("Content-Disposition","attachment;filename="+newString(fileName.getBytes("gb2312"),"ISO8859-1"));

在确保附件文件名都是简体中笔墨的情形下,那末这个举措的确是最无效的,不必让客户逐一的晋级IE。假如台湾同胞用,把gb2312改成big5就行。但如今的体系一般都到场了国际化的撑持,广泛利用UTF-8。假如文件名中又有简体中笔墨,又有繁体中文,另有日文。那末乱码便发生了。别的,在我的电脑上Firefox(v1.0-en)下载也是乱码。

折衷思索,我分离了1、三的体例,代码片段以下:
复制代码代码以下:
StringfileName=URLEncoder.encode(atta.getFileName(),"UTF-8");
/*
*seehttp://support.microsoft.com/default.aspx?kbid=816868
*/
if(fileName.length()>150){
StringguessCharset=xxxx/*依据request的locale得出大概的编码,中文操纵体系一般是gb2312*/
fileName=newString(atta.getFileName().getBytes(guessCharset),"ISO8859-1");
}
response.setHeader("Content-Disposition","attachment;filename="+fileName);

临时不思索Firefox是由于它今朝仿佛还没有无力侵食到IE的企业用户市场。影响客户买单的经常是进度,而不是兼容度。有个问题想请教你一下,呵呵:)你觉得将来学什么方向比较好,我真是想不出来,知道的太少了,麻烦了。
小魔女 该用户已被删除
沙发
发表于 2015-1-19 08:44:00 | 只看该作者
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
分手快乐 该用户已被删除
板凳
发表于 2015-1-26 13:27:48 | 只看该作者
众所周知,Windows以易用而出名,也因此占据不少的服务器市场。
精灵巫婆 该用户已被删除
地板
发表于 2015-2-4 16:56:00 | 只看该作者
ASP(ActiveServerPages)是Microsfot公司1996年11月推出的WEB应用程序开发技术,它既不是一种程序语言,也不是一种开发工具,而是一种技术框架,不须使用微软的产品就能编写它的代码。
飘灵儿 该用户已被删除
5#
发表于 2015-2-10 04:29:13 | 只看该作者
在asp.net虚拟主机的服务提供商中,目前首推的是CNNIC的其中一家域名注册机构---时代互联(www.now.net.cn),他们早在2001年微软刚推出Asp.net时就推出了对应的Asp.net虚拟主机了,经笔者的使用测试,他提供的Asp.net性能非常的稳定,版本也会定期的更新,目前他的
透明 该用户已被删除
6#
发表于 2015-2-28 19:46:22 | 只看该作者
我的意思是.net好用,从功能上来说比JAVA强还是很明显的。
老尸 该用户已被删除
7#
发表于 2015-3-10 07:32:19 | 只看该作者
有一丝可惜的是,这个系列太强了,Java阵营的朋友根本就是哑口无言...争论之火瞬间被浇灭,这不是我想这么早就看到的,但是值了。
深爱那片海 该用户已被删除
8#
发表于 2015-3-17 05:17:24 | 只看该作者
但是java靠开源打出的一片天地,特别是在微软的垄断下能打开今天的局面还是有它的生命力的。
山那边是海 该用户已被删除
9#
发表于 2015-3-23 22:41:22 | 只看该作者
由于JSP/Servlet都是基于Java的,所以它们也有Java语言的最大优点——平台无关性,也就是所谓的“一次编写,随处运行(WORA–WriteOnce,RunAnywhere)”。除了这个优点,JSP/Servlet的效率以及安全性也是相当惊人的。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 20:22

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表