HttpApplication实战大文件上传 (第四篇)
一、Asp.net中的文件上传
在Asp.net 1.1中,文件在上传过程中将被全部保存在内存中,对于大文件来说,会造成内存空间的过度使用,可能会招致恶意攻击。为了解决这个问题,Asp.net在配置文件中提供了一个参数来控制上传文件的尺寸,这个配置参数定义在System.Web元素的子元素HttpRuntime元素中。maxRequestLength属性用来设置允许的最大请求长度,这个参数的单位是KB,默认情况下,参数的值为4096,也就是最大能上传大约4M大小的文件。如果希望上传10M的文件,可以设置配置文件WebConfig.config如下:
<system.web>
<httpRuntime maxRequestLength="10240" />
</system.web>
在Asp.net 2.0之后,上传的文件可以缓存到文件中,以减少对内存的消耗。httpRuntime元素提供了一个新的配置参数requestLengthDiskThreshold属性,用来设置一个上传文件尺寸的临时大小值,超过这个值,请求的内容将会被保存到文件中。这个参数的单位也是KB,默认为80,这个值不应该超过maxRequestLength参数。
maxRequestLength元素虽然可以自定义设置,但是最大也不能超过2097151KB(最大不能大于2G),可以看到还设置了executionTimeout元素, executionTimeout元素表示请求允许被执行的秒数,默认为110秒(.Net Framework1.1 时默认为:90秒);
当上传文件越大,执行请求的时间也就越长,所以根据设置的maxRequestLengtht适当的调整executionTimeout元素的值(单位为:秒)。
当请求的内容长度超过门槛的限值之后,请求的内容将会被保存到文件中,这个文件的位置由compilation配置元素的tempDirectory属性指定。
<compilation tempDirectory="D:\123\" targetFramework="4.0"/>
当这个参数的值为空时,临时文件将会笨哦保存在%FrameworkInstallLocation%\Temporary ASP.NET文件夹下。在Windows7下使用开发服务器的时候,临时文件会保存在C:\Users\用户名\AppData\Local\Temp\Temporary ASP.NET Files\中。
Asp.net 2.0的有了很大的改进,但是对于大型文件的上传,我们并不能掌握上传的进度,在AJAX中,就难以显示一个动态的上传进度条,不能提供给用户一个友好的上传进度反馈。在Asp.net 2.0之后,直到Asp.net 4.0中,当使用multipart/form-data方式的请求时,Asp.net会将请求的Post数据通过System.Web.HttpRawUploadedContent进行管理,这是一个内部类,我们不能直接使用,HttpRequest的私有成员_rawContent将指向这样一个对象的实例。
二、文件上传的解决方案
在Asp.net中,浏览器的请求数据到达Asp.net网站后,被包装为一个内部的对象HttpWorkerRequest,客户端发送到服务器的数据在内部通过这个对象来读取,HttpRequest提供了针对请求数据的包装,从Asp.net 2.0开始,在上传文件过程中,上传的数据通过HttpRawUploadedContent对象来表示,这是HttpRequest的一个内部成员,可以通过HttpRequest还没有读取上传文件的情况下,接管Asp.net对请求参数的读取过程,实现自定义针对文件上传处理。
对于其他的Post数据,可以通过反射来构建一个模拟的HttpRawUploadedContent对象实例,提供给HttpRequest使用,保证在后继的处理中正常获取表单的数据。
1、通过HttpModule接管请求参数
在文件上传过程中,Asp.net架构的底层会读取HTTP请求中的信息,在系统内部创建一个类型为HttpRawUploadedContent的对象来表示请求参数,这个对象被HttpRequest对象所使用。
为了接管HttpRequest对请求参数的处理,我们注册HttpApplication的最早的事件BeginRequest,然后将读取的数据保存到一个自定义的对象中。为了能够在后继的处理过程中继续通过HttpRequest来访问请求数据,我们创建一个伪造的HttpRawUploadedContent提供给HttpRequest对象使用。
HttpApplication实战大文件上传 (第四篇)的更多相关文章
- Selenium2学习-039-WebUI自动化实战实例-文件上传下载
通常在 WebUI 自动化测试过程中必然会涉及到文件上传的自动化测试需求,而开发在进行相应的技术实现是不同的,粗略可划分为两类:input标签类(类型为file)和非input标签类(例如:div.a ...
- 解决PHP大文件上传问题
PHP大文件上传问题 今天负责创业计划大赛的老师问我作品上报系统上传不了大文件,我当时纳闷了,做的时候没限制上传文件的大小阿,怎么会传不了呢,自己亲自体验了番,果然不 行,想了好一会儿才有点眉目 ...
- 【原创】用JAVA实现大文件上传及显示进度信息
用JAVA实现大文件上传及显示进度信息 ---解析HTTP MultiPart协议 (本文提供全部源码下载,请访问 https://github.com/grayprince/UploadBigFil ...
- 使用NeatUpload控件实现ASP.NET大文件上传
使用NeatUpload控件实现ASP.NET大文件上传 一般10M以下的文件上传通过设置Web.Config,再用VS自带的FileUpload控件就可以了,但是如果要上传100M甚至1G的文件就不 ...
- 用JAVA实现大文件上传及显示进度信息
一. 大文件上传基础描述: 各种WEB框架中,对于浏览器上传文件的请求,都有自己的处理对象负责对Http MultiPart协议内容进行解析,并供开发人员调用请求的表单内容. 比如: Spring 框 ...
- C# 大文件上传
IHttpModule 分块上传大文件 IHttpModule 分块上传大文件 来源:http://www.cnblogs.com/HeroBeast/archive/2008/03/18/10848 ...
- vue大文件上传控件选哪个好?
需求: 项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在20G内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以20G来进行限制. PC端全平台支持,要求支持Window ...
- vue大文件上传组件选哪个好?
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
- web实现大文件上传分片上传断点续传
需求:项目要支持大文件上传功能,经过讨论,初步将文件上传大小控制在500M内,因此自己需要在项目中进行文件上传部分的调整和配置,自己将大小都以501M来进行限制. 第一步: 前端修改 由于项目使用的是 ...
随机推荐
- Qt实现基于G.729A(G729A)的语音聊天
一.G.729协议简介G.729协议是由ITU-T的第15研究小组提出的,并在1996年3月通过的8Kbps的语音编码协议.G.729系列主要有以下几种:G.729—最基本的G.729标准协议,原始版 ...
- .Net XML操作 <第二篇>
一.XML文件操作中与.Net中对应的类 微软的.NET框架在System.xml命名空间提供了一系列的类用于Dom的实现. 以下给出XML文档的组成部分对应.NET中的类: XML文档组成部分 对应 ...
- awk详解
一.简介 强大的文本分析工具,基于指定规则浏览和抽取信息.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理.awk有3个不同版本: awk.nawk和ga ...
- ucfirst() strtoupper() strtolower()
ucfirst 将字符串第一个字符改大写. 语法: string ucfirst(string str); 返回值: 字符串 函数种类: 资料处理 内容说明 本函数返回字符串 str 第一个字的字 ...
- Windows通用应用平台
什么是 UWP? 很多程序员都有一个梦想:希望自己开发的软件能够轻而易举的在所有平台上运行,而不是把同样的需求,用不同的技术.工具重新开发才能够运行在所有平台上.这就是跨平台,很多软件从业者都在为这个 ...
- jquery常用方法以及详解
$("p").addClass(css中定义的样式类型); 给某个元素添加样式 $("img").attr({src:"test.jpg", ...
- JS 数组扩展函数--求起始项到终止项和
Array.prototype.sum= function(l,r){ l=l==undefined ? 0 : l; r=r==undefined ? this.length - 1 : r; va ...
- 把Go程序变小的办法
把Go程序变小的办法是: go build -ldflags “-s -w” (go install类似) -s去掉符号表(然后panic时候的stack trace就没有任何文件名/行号信息了, 这 ...
- Flashback version/Transaction Query,FlashbackTable
Flashback version Query相对于Flashback Query 只能看到某一点的对象状态, Oracle 10g引入的Flashback Version Query可以看到过去某个 ...
- Android编译过程详解(二)
通过上篇文章,我们分析了编译android时source build/envsetup.sh和lunch命令,在执行完上述两个命令后, 我们就可以进行编译android了. 1. make 执行ma ...