|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
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的企业用户市场。影响客户买单的经常是进度,而不是兼容度。有个问题想请教你一下,呵呵:)你觉得将来学什么方向比较好,我真是想不出来,知道的太少了,麻烦了。 |
|