asp.net 上传大文件解决方案

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

而思归所说的方法使用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
通过Web Services上传和下载文件
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

(0)

相关推荐

  • asp.net(C#)中上传大文件的几中常见应用方法

    几种常见的方法,本文主要内容包括: 第一部分:首先我们来说一下如何解决ASP.net中的文件上传大小限制的问题,我们知道在默认情况下ASP.NET的文件上传大小限制为2M,一般情况下,我们可以采用更改Web.Config文件来自定义最大文件大小,如下: 这样上传文件的最大值就变成了4M,但这样并不能让我们无限的扩大 MaxRequestLength的值,因为ASP.NET会将全部文件载入内存后,再加以处理.解决的方法是利用隐含的 HttpWorkerRequest,用它的GetPreloaded

  • .NET的file文件上传控件使用方法 修改web.config文件上传大文件

    修改Webcong文件: 以下为引用的内容: 复制代码 代码如下: <system.web> <httpRuntime maxRequestLength="40690" useFullyQualifiedRedirectUrl="true" executionTimeout="6000" useFullyQualifiedRedirectUrl="false" minFreeThreads="8&q

  • asp.net 上传大文件解决方案

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

  • HTTP协议下用Web Service上传大文件的解决方案

    用HTTP协议上传大文件也许是个不好办的问题.主要是它的不连续性,使得上传文件感觉很"危险".特别是很大的文件(几百MB甚至是上G的文件),心里总觉得不踏实,一不小心就会出现问题,而一但出现问题就无法继续上传,这是很郁闷的. 后来在一些网站上找到一些上传文件的组件,但都是要用到一些COM组件.至于后来的ASP.net下上传大文件的解决方案,我也做过一个组件,后来发现根本就不用自己写什么组件,利用ASP.net自己的上传方法也可以解决大文件上传,真是郁闷的要死了.... 回想之后,决定用

  • ASP.NET解决上传大文件问题的方法

    上传文件的控件为:FileUpload Asp.Net对上传文件大小有限制.默认情况下用户只能上传4MB大小的文件,这会给用户带来不便.所以如果要上传40MB大小的文件.只能修改配置文件 关键代码如下 复制代码 代码如下: protected void btnSend_Click(object sender, EventArgs e) { try { //上传文件的思路: //获取上传文件的名称,此时为一个全路径的地址 string upFileName = fulFileName.FileNa

  • Asp.Net上传文件并配置可上传大文件的方法

    ASP.NET 包含两个控件可以使用户向网页服务器上传文件.一旦服务器接受了上传的文件数据,那么应用程序就可以进行保存,进行检查或者忽略它. HtmlInputFile - HTML 服务器控件 FileUpload - ASP.NET 网页控件 两种控件都允许文件上传,但是 FileUpload 控件自动设置编码格式,然而 HtmlInputFile 控件并不会这样. 1.使用HtmlInputFile文件上传 前台 <form enctype="multipart/form- data

  • asp.net上传Excel文件并读取数据的实现方法

    前言 本文主要给大家介绍了关于asp.net上传Excel文件并读取数据的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧 实现如下: 前台代码:使用服务端控件实现上传 <form id="form1" runat="server"> <div> <asp:FileUpload ID="ExcelFileUpload" runat="server" /> <as

  • SSM框架+Plupload实现分块上传大文件示例

    关于Plupload的介绍,相信它的官网http://www.plupload.com/已经给得很详细了.Plupload的上传原理简单点说,就是将用户选中的文件(可多个)分隔成一个个小块,依次向服务器上传,这是它能驾驭上传大文件的原因之一,而且在这个过程可以暂停上传,暂停后再继续上传(异于断点续传).最重要的是,从头到尾没有一点点UI阻塞,保证了用户体验.下面会开始讲Plupload的实现流程,分析原理,并在最后给出效果图. 在此之前先说说我的项目,做的j2ee项目运用到spring+Spri

  • Java中使用WebUploader插件上传大文件单文件和多文件的方法小结

    一.使用webuploader插件的原因说明 被现在做的项目坑了. 先说一下我的项目架构spring+struts2+mybatis+MySQL 然后呢.之前说好的按照2G上传就可以了,于是乎,用了ajaxFileUpload插件,因为之前用图片上传也是用这个,所以上传附件的时候就直接拿来用了 各种码代码,测试也测过了,2G文件上传没问题,坑来了,项目上线后,客户又要求上传4G文件,甚至还有20G以上的..纳尼,你不早说哦... 在IE11下用ajaxFileUpload.js插件上传超过4G的

  • FireFox浏览器使用Javascript上传大文件

    本程序是利用3.x的Firefox浏览器可以读取本地文件的特性,实现通过xmlHttPRequest上传大文件功能,并在可以上传过程中动态显示上传进度.略加修改,并与服务器端配合,可以实现断点续传等诸多功能.本例主要是研究FireFox的file-input节点的一些特性,其他客户端应用,如Flash.Sliverlight等,在实现客户端大文件上传时,在数据传输与服务器端存储等方面,与本例的思路基本一致.注意:文件体积似乎有临界点,但这个临界点是多少尚未确认.建议不要用此方法上传超过100M的

  • php上传大文件失败的原因及应对策略

    为什么上传大文件总是失败,但是上传小文件就没有问题.小编也不得其解,网上搜其原因,整理了一篇关于php上传大文件失败的原因和解决办法的文章,分享给大家. 下面分别是各种原因以及解决办法: 第1种情况:文件上传时存放文件的临时目录必须是开启的并且是 PHP 进程所有者用户可写的目录.如果未指定则 PHP 使用系统默认值. php.ini文件中upload_tmp_dir用来说明PHP上传的文件放置的临时目录,要想上传文件,得保证服务器没有关闭临时文件并对该文件夹有写入的权限. 第2种情况:max_

  • Nginx 上传大文件超时解决办法

    Nginx 上传大文件超时解决办法 情况如下:用nginx作代理服务器,上传大文件时(本人测试上传50m的文件),提示上传超时或文件过大. 原因是nginx对上传文件大小有限制,而且默认是1M.另外,若上传文件很大,还要适当调整上传超时时间. 解决方法是在nginx的配置文件下,加上以下配置: client_max_body_size 50m; //文件大小限制,默认1m client_header_timeout 1m; client_body_timeout 1m; proxy_connec

随机推荐