`

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;
}

分享到:
评论

相关推荐

    asp.net 批量上传文件

    `Web.config`文件是ASP.NET应用程序的配置文件,其中包含了应用程序运行时所需的各种设置。对于文件上传,我们可能需要配置`&lt;httpRuntime&gt;`节,调整如`maxRequestLength`(限制上传文件的大小)和`executionTimeout`...

    【ASP.NET编程知识】asp.net单文件带进度条上传的解决方案.docx

    web.config文件是一个ASP.NET应用程序的配置文件,能够帮助我们配置文件上传的功能。在本文中,我们使用web.config文件来配置文件上传的最大值。 知识点8:使用MSDN查看文件上传的限制 在本文中,我们使用MSDN来...

    asp.net+flash批量上传

    asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件上传 批量上传 上传代码 上载asp.net上传 多文件...

    ASP.NET Web API 接收文件上传

    ASP.NET Web API 是微软开发的一个用于构建RESTful服务的框架,它可以轻松地为Web应用程序、移动设备和桌面应用提供数据接口。在ASP.NET Web API中处理文件上传是常见的需求,特别是当你需要允许用户通过Web界面提交...

    asp.net 超大文件上传,带进度条源码,亲测能用

    在处理大文件上传时,ASP.NET需要特别的处理,因为默认情况下,它对上传文件的大小有限制,通常为4MB左右。针对超大文件上传的需求,开发者通常需要采取一些策略来优化和扩展这一功能,同时加入进度条显示可以提升...

    基于ASP.net的企业文件管理系统源码.zip

    对于学习者或开发者来说,这是一个极好的资源,可以深入理解ASP.NET如何应用于企业级文件管理系统的实现,以及如何利用C#(ASP.NET的主要编程语言)来设计和实现文件管理功能。 【标签】:“毕业设计 C# Java PHP”...

    【ASP.NET编程知识】ASP.NET Core文件上传与下载实例(多种上传方式).docx

    ASP.NET Core 文件上传与下载实例(多种上传方式) 知识点1: ASP.NET Core 文件上传与下载实例 ASP.NET Core 2.0 已经很成熟,可以使用模型绑定上传文件。官方文档提供了相关的示例代码,可以作为参考。 知识点2:...

    asp.net 大文件上传 超过2G

    1. **配置IIS限制**:IIS(Internet Information Services)作为ASP.NET应用程序的托管环境,其默认配置可能不允许上传如此大的文件。我们需要在Web.config文件中增加`maxRequestLength`和`executionTimeout`的值,...

    asp.net 导出 pdf 文件

    在 ASP.NET 中,导出 PDF 文件是一项常见的需求,主要用于生成报表、发票或证书等文档。PDF(Portable Document Format)格式因其跨平台性和可读性而被广泛应用。在本篇文章中,我们将深入探讨如何在 ASP.NET 环境下...

    ASP.Net应用中常见的文件类型

    在ASP.NET应用程序开发过程中,了解并熟悉各种文件类型对于构建高效、可维护的应用程序至关重要。以下是对ASP.NET应用中常见的文件类型的详细介绍: ### 1. C#源代码文件(.cs) C# 是 ASP.NET 应用中最常用的编程...

    asp.net 应用实例

    【ASP.NET 应用实例详解】 ASP.NET 是微软公司推出的一种用于构建动态网站、Web 应用程序和...通过阅读和分析这些文件,开发者可以深入了解ASP.NET在实际项目中的应用,并学习到如何在自己的项目中实施类似的功能。

    asp.net 上传大文件例子

    本示例主要探讨如何在ASP.NET应用中实现大文件的上传,涉及到的关键技术包括C#编程语言、多部分表单数据处理以及流处理。 首先,ASP.NET中的上传文件功能是基于HTTP协议的POST请求,而HTTP协议本身对单个请求的数据...

    asp.net C# 多文件上传带进度条的上传实例

    总的来说,"asp.net C# 多文件上传带进度条的上传实例"是一个综合性的技术实践,它涵盖了文件上传、异步处理、前端交互、进度反馈等多个方面,对于学习和掌握ASP.NET+C#的高级应用非常有价值。通过深入研究和实践这...

    asp.net mvc+Bootstrap Fileinput框架实现的文件上传

    以上是关于"asp.net mvc+Bootstrap Fileinput框架实现的文件上传"的相关知识点,这个示例提供了在ASP.NET MVC环境中集成Bootstrap Fileinput进行文件上传的完整流程,对于开发者来说具有很好的参考价值。通过学习和...

    asp.net Ajax 安装文件

    ASP.NET AJAX,全称为ASP.NET Asynchronous JavaScript and XML,是微软为.NET Framework提供的一套用于构建高度交互式和响应迅速的Web应用程序的技术。它通过结合JavaScript、XML以及服务器端的.NET技术,允许...

    asp.net +telerik大文件上传案例

    首先,`Default.aspx`是ASP.NET应用的主要页面,它包含了用户界面元素,如Telerik的FileUpload控件,允许用户选择并上传大文件。在设计视图中,这个控件可能已经配置为支持分块上传或进度条显示,以提供更好的用户...

    asp.net+flex批量上传文件

    本教程将重点讨论如何使用ASP.NET与Adobe Flex技术实现批量文件上传的功能。这两种技术的结合为开发人员提供了跨平台的灵活性,同时保证了前端的交互性和后端的强大处理能力。 首先,ASP.NET是微软公司推出的一种...

    ASP.NET应用开发案例教程

    上篇 ASP.NET应用与开发基础 第1章 ASP.NET概论 1.1 ASP.NET简介 1.1.1 从.NET谈起 1.1.2 动态网站设计技术 1.1.3 ASP.NET的介绍 1.1.4 ASP.NET和ASP的对比 1.2 运行环境配置 1.2.1 ASP...

    asp.net中文件的上传下载,删除

    在ASP.NET中,文件的上传、下载和删除是常见的功能需求,特别是在构建Web应用程序时。本文将详细讲解如何实现这些操作,并重点介绍提供的"FileUpDownDelete"开发工具包。 首先,我们来了解一下ASP.NET文件上传的...

Global site tag (gtag.js) - Google Analytics