ASP.NET应用中大文件上传研究

在项目中经常要用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,两个控件的方法是:利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据。Chris Hynes为我们提供了这样的一个方案(用HttpModule),该方案除了允许你上传大文件外,还能实时显示上传进度。

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

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

HttpApplication application1 = sender as HttpApplication;
HttpWorkerRequest request1 = (HttpWorkerRequest) ((IServiceProvider) HttpContext.Current).GetService(typeof(HttpWorkerRequest));
try
{
  if (application1.Context.Request.ContentType.IndexOf("multipart/form-data") <= -1)
  {
return;
  }
  //Check The HasEntityBody
  if (!request1.HasEntityBody())
  {
return;
  }
  int num1 = 0;
  TimeSpan span1 = DateTime.Now.Subtract(this.beginTime);
  string text1 = application1.Context.Request.ContentType.ToLower();
  byte[] buffer1 = Encoding.ASCII.GetBytes(("\r\n--" + text1.Substring(text1.IndexOf("boundary=") + 9)).ToCharArray());
  int num2 = Convert.ToInt32(request1.GetKnownRequestHeader(11));
  Progress progress1 = new Progress();
  application1.Context.Items.Add("FileList", new Hashtable());
  byte[] buffer2 = request1.GetPreloadedEntityBody();
  num1 += buffer2.Length;
  string text2 = this.AnalysePreloadedEntityBody(buffer2, "UploadGUID");
  if (text2 != string.Empty)
  {
application1.Context.Items.Add("LionSky_UpLoadModule_UploadGUID", text2);
  }
  bool flag1 = true;
  if ((num2 > this.UpLoadFileLength()) && ((0 > span1.TotalHours) || (span1.TotalHours > 3)))
  {
flag1 = false;
  }
  if ((0 > span1.TotalHours) || (span1.TotalHours > 3))
  {
flag1 = false;
  }
  string text3 = this.AnalysePreloadedEntityBody(buffer2, "UploadFolder");
  ArrayList list1 = new ArrayList();
  RequestStream stream1 = new RequestStream(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;
ArrayList list2;
int num3 = 204800;
byte[] buffer3 = new byte[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 = new byte[list2.Count + buffer3.Length];
list2.CopyTo(buffer4, 0);
buffer3.CopyTo(buffer4, list2.Count);
stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
  }
  else
  {
stream1 = new RequestStream(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 = new byte[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 = new byte[list2.Count + buffer3.Length];
  list2.CopyTo(buffer4, 0);
  buffer3.CopyTo(buffer4, list2.Count);
  stream1 = new RequestStream(buffer4, buffer1, stream1.FileStream, stream1.FStatus, stream1.RStatus, text3, flag1, application1.Context, stream1.OriginalFileName);
}
else
{
  stream1 = new RequestStream(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 = new byte[list1.Count];
  list1.CopyTo(buffer5);
  this.PopulateRequestData(request1, buffer5);
}
catch (Exception exception1)
{
  this.ClearApplication(application1);
  throw exception1;
}

时间: 2024-12-25 10:26:46

ASP.NET应用中大文件上传研究的相关文章

ASP.NET 应用中大文件上传研究

asp.net|上传 在项目中经常要用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,两个控件的方法是:利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEntityBody方法从IIS为ASP.NET建立的pipe里分块读取数据.Chris Hynes为我们提供了这样的一个方案(用HttpModule

asp.net网站中大文件上传的处理方法

问题描述 现在在做一个网站,想要把视频,图片,ppt等文件资源上传到文件夹中,怎么处理啊,用Fileupload用大小限制,用第三方组件不兼容windows7系统,还有iis配置的问题,然后想把大的文件切割成小的一块一块的在上传,这个方法行的通吗,怎么实现 解决方案 解决方案二:SWFUpload应该可以的,采用的是Flash上传,浏览器一般都是支持的利用Flash上传大文件:swfupload修改以及详细说明http://www.cnblogs.com/rexying/archive/2009

利用ASP.NET设计FTP文件上传(純前臺代碼)

asp.net|上传|设计|asp.net|上传 <% @ Import Namespace=" System.IO " %><html ><BODY ><SCRIPT LANGUAGE = "VB" RUNAT = "SERVER" > Sub UploadFile_Clicked ( Sender as Object, e as EventArgs ) Dim lstrFileName as s

利用ASP.NET设计FTP文件上传(下)

四. 程序源代码: <% @ Import Namespace=" System.IO " %><html ><BODY ><SCRIPT LANGUAGE = "VB" RUNAT = "SERVER" > Sub UploadFile_Clicked ( Sender as Object, e as EventArgs ) Dim lstrFileName as string Dim lstrF

asp.net中的文件上传控件能否打开一个固定文件夹然后再选择文件

问题描述 asp.net中的文件上传控件能否打开一个固定文件夹然后再选择文件asp.net中的文件上传控件能否打开一个固定文件夹然后再选择文件我现在要上传文件,但是在点击浏览的时候我想要打开一个指定的目录,然后在这个目录中选择文件..用什么方法能够实现呢?请各位大侠帮忙呀!!!!!!!!!??????????????????????????谢谢各位!!!!!!!! 解决方案 解决方案二:属于客户端程序,安全考虑的话怕不可行解决方案三:可以,将所选目录文件列出就行了,用常用的IO操作就能实现CSD

利用ASP.NET设计FTP文件上传(

<% @ Import Namespace=" System.IO " %><html ><BODY ><SCRIPT LANGUAGE = "VB" RUNAT = "SERVER" > Sub UploadFile_Clicked ( Sender as Object, e as EventArgs ) Dim lstrFileName as string Dim lstrFileNamePat

ASP.NET设计FTP文件上传的解决方案_实用技巧

如果要用ASP来作一个FTP文件上传的页面,我想很多人立刻就会想到要用第三方开发的组件,利用第三方的组件,虽然开发起来相对比较容易.但一般来说,免费下载的第三方的组件都有某些方面的功能限制,若要购买正版的第三方组件,对于国内的用户,花销也是一个不小的数字,就是能够承担的起,烦杂的手续也使很多人望而却步.虽然微软公司在本身的视窗系统里面也提供了一个可以用来上传文件的组件--Posting Acceptor.但用过这个组件的朋友们都有一种普遍的感觉,就是实在不好用. 现在好了,自从微软公司推出了.N

大文件上传研究

上传 这次在项目中,用到了大文件上传,要上传的文件有100多m,于是研究现在国内使用的大文件上传的组件发现用的比较多的有两个控件AspnetUpload 2.0和Lion.Web.UpLoadModule,另外还有思归在它的博客堂中所说的办法 http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx 两个控件的方法是:利用隐含的HttpWorkerRequest,用它的GetPreloadedEntityBody 和 ReadEnt

asp.net下大文件上传知识整理_实用技巧

最近做在做ePartner项目,涉及到文件上传的问题. 以前也做过文件上传,但都是些小文件,不超过2M. 这次要求上传100M以上的东西. 没办法找来资料研究了一下.基于WEB的文件上传可以使用FTP和HTTP两种协议,用FTP的话虽然传输稳定,但安全性是个严重的问题,而且FTP服务器读用户库获取权限,这样对于用户使用来说还是不太方便. 剩下只有HTTP.在HTTP中有3种方式,PUT.WEBDAV.RFC1867,前2种方法不适合大文件上传,目前我们使用的web上传都是基于RFC1867标准的