HttpApplication实战大文件上传 (第四篇)
2014-01-23 09:24
363 查看
一、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实战大文件上传 (第四篇)
- HttpApplication实战大文件上传 (第四篇)
- android 上传文件"Content-Type",为"application/octet-stream" 用php程序在服务端用$GLOBALS['HTTP_RAW_POST_DATA']接受(二)
- android 上传文件"Content-Type",为"application/octet-stream" 用php程序在服务端用$GLOBALS['HTTP_RAW_POST_DATA']接受(二)
- spring3,上传文件ApplicationHttpRequest cannot be ca...
- HttpApplication实战大文件上传 (第四篇)
- http以post方式上传一个文件,构造其请求头和消息报文 application/x-www-form-urlencoded multipart/form-data
- jmeter之http请求-如何上传文件,MIME 类型填入:application/octet-stream
- 文件上传 content-type:application/json System.Web.HttpContext.Current.Request.InputStream 读取不到数据
- 【Android实战】----基于Retrofit实现多图片/文件、图文上传
- spring mvc 中上传文件时根本就不访问HttpServletRequest请求的解决方案
- AsyncHttpClient+Servlet实现文件上传下载
- XMLHttpRequest实现HTTP协议下文件上传断点续传
- HttpClient 4 - 文件上传
- http post不使用库,上传带参数的文件时的消息体样式
- HttpURLConnection上传文件(图片)小试
- 大文件上传的HttpModule实现。(一)
- 解决MVC下使用uploadify上传文件时HttpPostedFileBase为空的问题
- iOS通过http post上传图片, 文件等
- ajax上传文件,提交表单,使用FormData和XMLHttpRequest提交表单