程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> ASP.NET >> 關於ASP.NET >> ASP.NET應用中大文件上傳研究

ASP.NET應用中大文件上傳研究

編輯:關於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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved