广

ASP.NET

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

    如何在ASP.NET 应用中上传大文件

    2018-04-13 09:17:03 次阅读 稿源:互联网
    广告

    在项目中经常要用到了大文件上传,要上传的文件有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;
    }

    一起学吧部分文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与一起学吧进行文章共享合作。

    广告
    广告
    广告