手机
当前位置:查字典教程网 >编程开发 >asp.net教程 >asp.net 上传大文件解决方案
asp.net 上传大文件解决方案
摘要:这次在项目中,用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的组件发现用的比较多的有两个控件AspnetUpl...

这次在项目中,用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的

组件发现用的比较多的有两个控件AspnetUpload2.0和Lion.Web.UpLoadModule,另外还有思归在它的博客

堂中所说的办法http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx

两个控件的方法是:利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody和ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。ChrisHynes为我们提供了这样的一个方案(用HttpModule),该方案除了允许你上传大文件外,还能实时显示上传进度。

Lion.Web.UpLoadModule和AspnetUpload两个.NET组件都是利用的这个方案。

当上传单文件时,两个软件的方法是一样的,继承HttpModule

HttpApplicationapplication1=senderasHttpApplication;

HttpWorkerRequestrequest1=(HttpWorkerRequest)((IServiceProvider)HttpContext.Current).GetService(typeof(HttpWorkerRequest));

try

{

if(application1.Context.Request.ContentType.IndexOf("multipart/form-data")<=-1)

{

return;

}

//CheckTheHasEntityBody

if(!request1.HasEntityBody())

{

return;

}

intnum1=0;

TimeSpanspan1=DateTime.Now.Subtract(this.beginTime);

stringtext1=application1.Context.Request.ContentType.ToLower();

byte[]buffer1=Encoding.ASCII.GetBytes(("rn--"+text1.Substring(text1.IndexOf("boundary=")+9)).ToCharArray());

intnum2=Convert.ToInt32(request1.GetKnownRequestHeader(11));

Progressprogress1=newProgress();

application1.Context.Items.Add("FileList",newHashtable());

byte[]buffer2=request1.GetPreloadedEntityBody();

num1+=buffer2.Length;

stringtext2=this.AnalysePreloadedEntityBody(buffer2,"UploadGUID");

if(text2!=string.Empty)

{

application1.Context.Items.Add("LionSky_UpLoadModule_UploadGUID",text2);

}

boolflag1=true;

if((num2>this.UpLoadFileLength())&&((0>span1.TotalHours)||(span1.TotalHours>3)))

{

flag1=false;

}

if((0>span1.TotalHours)||(span1.TotalHours>3))

{

flag1=false;

}

stringtext3=this.AnalysePreloadedEntityBody(buffer2,"UploadFolder");

ArrayListlist1=newArrayList();

RequestStreamstream1=newRequestStream(buffer2,buffer1,null,RequestStream.FileStatus.Close,RequestStream.ReadStatus.NoRead,text3,flag1,application1.Context,string.Empty);

list1.AddRange(stream1.ReadBody);

if(text2!=string.Empty)

{

progress1.FileLength=num2;

progress1.ReceivedLength=num1;

progress1.FileName=stream1.OriginalFileName;

progress1.FileCount=((Hashtable)application1.Context.Items["FileList"]).Count;

application1.Application["_UploadGUID_"+text2]=progress1;

}

if(!request1.IsEntireEntityBodyIsPreloaded())

{

byte[]buffer4;

ArrayListlist2;

intnum3=204800;

byte[]buffer3=newbyte[num3];

while((num2-num1)>=num3)

{

if(!application1.Context.Response.IsClientConnected)

{

this.ClearApplication(application1);

}

num3=request1.ReadEntityBody(buffer3,buffer3.Length);

num1+=num3;

list2=stream1.ContentBody;

if(list2.Count>0)

{

buffer4=newbyte[list2.Count+buffer3.Length];

list2.CopyTo(buffer4,0);

buffer3.CopyTo(buffer4,list2.Count);

stream1=newRequestStream(buffer4,buffer1,stream1.FileStream,stream1.FStatus,stream1.RStatus,text3,flag1,application1.Context,stream1.OriginalFileName);

}

else

{

stream1=newRequestStream(buffer3,buffer1,stream1.FileStream,stream1.FStatus,stream1.RStatus,text3,flag1,application1.Context,stream1.OriginalFileName);

}

list1.AddRange(stream1.ReadBody);

if(text2!=string.Empty)

{

progress1.ReceivedLength=num1;

progress1.FileName=stream1.OriginalFileName;

progress1.FileCount=((Hashtable)application1.Context.Items["FileList"]).Count;

application1.Application["_UploadGUID_"+text2]=progress1;

}

}

buffer3=newbyte[num2-num1];

if(!application1.Context.Response.IsClientConnected&&(stream1.FStatus==RequestStream.FileStatus.Open))

{

this.ClearApplication(application1);

}

num3=request1.ReadEntityBody(buffer3,buffer3.Length);

list2=stream1.ContentBody;

if(list2.Count>0)

{

buffer4=newbyte[list2.Count+buffer3.Length];

list2.CopyTo(buffer4,0);

buffer3.CopyTo(buffer4,list2.Count);

stream1=newRequestStream(buffer4,buffer1,stream1.FileStream,stream1.FStatus,stream1.RStatus,text3,flag1,application1.Context,stream1.OriginalFileName);

}

else

{

stream1=newRequestStream(buffer3,buffer1,stream1.FileStream,stream1.FStatus,stream1.RStatus,text3,flag1,application1.Context,stream1.OriginalFileName);

}

list1.AddRange(stream1.ReadBody);

if(text2!=string.Empty)

{

progress1.ReceivedLength=num1+buffer3.Length;

progress1.FileName=stream1.OriginalFileName;

progress1.FileCount=((Hashtable)application1.Context.Items["FileList"]).Count;

if(flag1)

{

progress1.UploadStatus=Progress.UploadStatusEnum.Uploaded;

}

else

{

application1.Application.Remove("_UploadGUID_"+text2);

}

}

}

byte[]buffer5=newbyte[list1.Count];

list1.CopyTo(buffer5);

this.PopulateRequestData(request1,buffer5);

}

catch(Exceptionexception1)

{

this.ClearApplication(application1);

throwexception1;

}

而思归所说的方法使用Mime也能上传大文件,在以下地址下载

http://krystalware.com/files/slickupload.zip

不过觉得的思归的方法容易很多

相关文章:

让asp.net默认的上传组件支持进度条反映

http://blog.joycode.com/dotey/archive/2005/06/12/53557.aspx//宝玉

http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx//思归

http://www.cnblogs.com/bestcomy/archive/2004/06/09/14267.aspx//bestcomy

http://krystalware.com/wiki/default.aspx/KrystalWiki.UploadSpike1

http://www.blueidea.com/tech/program/2005/2997.asp//ftp

通过WebServices上传和下载文件

http://dotnet.aspx.cc/ShowDetail.aspx?id=6381BD5F-51F3-4339-4239-1328564A1B2A

上传组件是如何不受settimeout限制的?

http://www.ietf.org/rfc/rfc1867.txt?number=1867

下载

http://support.microsoft.com/default.aspx?scid=kb;en-us;812406&Product=aspnet

【asp.net 上传大文件解决方案】相关文章:

asp.net用三层实现多条件检索示例

asp.net中使用cookie传递参数的方法

asp.net为网页动态添加关键词的方法

asp.net上传execl文件后,在页面上加载显示

ASP.NET 2005 Treeview终极解决方案

介绍asp.net 操作INI文件的读写

asp.net下url传递中文的解决方案

asp.net导出excel的简单方法

Asp.net(C#)文件操作函数大全

asp.net下使用DIME协议上传文件

精品推荐
分类导航