
2.5.2 ASP.NET中的文件上传
在ASP.NET 1.1中,文件在上传过程中将被全部保存在内存,对于大文件来说,会造成内存空间的过度使用,可能会招致恶意攻击。为了解决这个问题,ASP.NET在配置文件中提供了一个参数来控制上传文件的尺寸,这个配置参数定义在System.web元素的子元素httpRuntime元素中。maxRequestLength属性用来设置允许的最大请求长度,这个参数的单位是KB字节,默认情况下,参数的值为4096,也就是最大能上传大约4M大小的文件。如果希望上传10M的文件,可以如下设置。
<system.web> <httpRuntime maxRequestLength="10240"/> </system.web>
在ASP.NET 2.0之后,上传的文件可以缓存到文件中,以减少对内存的消耗。httpRuntime元素提供了一个新的配置参数requestLengthDiskThreshold属性,用来设置一个上传文件尺寸的门槛,超过这个门槛之后,请求的内容将会被保存到文件中。这个参数的单位也是KB,默认值为80,这个值不应该超过 maxRequestLength参数。
当请求的内容长度超过门槛的限值之后,请求的内容将会被保存到文件中,这个文件的位置由compilation配置元素的tempDirectory属性指定。
默认情况下,这个参数的值为空串。临时文件将会被保存在%FrameworkInstallLocation%\ Temporary ASP.NET文件夹下。在Windows7下使用开发服务器的时候,临时文件会保存在C:\Users\用户名\AppData\Local\Temp\Temporary ASP.NET Files\下面。
在ASP.NET 2.0之后,直到ASP.NET 4.0,当使用multipart/form-data方式的请求时,ASP.NET 会将请求的Post数据通过System.Web.HttpRawUploadedContent进行管理,这是一个内部类,我们不能直接使用,HttpRequest的私有成员_rawContent将指向这样一个对象实例。
虽然有了很大的改进,但是,对于大型文件的上传,我们并不能掌握上传的进度,在AJAX中,就难以显示一个动态的上传进度条,不能提供给用户一个友好的上传进程反馈。我们可以自定义一个文件上传的管理器来完成这个功能。