在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
最近看见有人在研究asp.net的上传组件,如何上传大文件的问题,于是简单地研究了一下,发现了一些东西,总结如下,希望大家能够提出一个较好的解决方案。 据msdn所言,在Web.Config中,默认可以上传的文件大小为8M,如果需要上传更大的文件,则需要手动指定: 这里的示例是最大100M的,经过测试,100M以下的文件还是可以正常上传的(占用内存必须在服务器可用内存60%以下)在使用.NET中的文件上传的功能时,实际上使用的是Html控件,并不是Web控件,这就意味着,HtmlInputFile控件不是明显地支持服务端的Event的,所以,提交时,应该使用Html控件的Button进行Submit。 经测试,可以发现,当不断地进行上传文件的时候,内存的消耗是不断地累积的,也就是说,当你上传了一个20M的文件后,再上传20M时,缓存中内存消耗会达到40M左右。 在MSDN文档中的说明里面指出,当文件上传到服务器后,是存储在缓存中的,在没有把缓存中的数据存储成文件时,是不会清空缓存的。 其实,这句话有一定的误导性,因为在HtmlInputFile控件中,PostedFile属性中,提供了一个SaveAs方法成员,给许多人一种错觉就是,当进行了HtmlInpuFile的SaveAs后,缓存会被清空。实际上不是这样,首先,查看一下HtmlInputFile中的PostedFile属性的代码,如下: [WebCategory("Default"), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden), DefaultValue("")] 好了,我们再看看,这个HttpPostFile中提供的SaveAs()的代码: 注意,用标记的那一句,观看整个代码,可以发现的是:实际上,在SavaAs方法中,处理的流是在此方法中新建的一个FileStream的实例,这里只有stream1.Flush(),而this._stream所指向的实例实际上还存在于缓存中,它才是真正占用了大量内存空间的罪人。 好了,再看看HttpPostedFile的构造函数,就可以知道this._stream是从哪里来的了. 不过,这里,我们要暂放一步,目前我们基本知道了实际上进行SaveAs方法后,缓存中的数据并没有被清除,相反的,它还好好地留在内存中。 我们的目标是要解决这个问题,正好,在HtmlInputFile中也给出了所创建的实例的引用,所以,现在,针对HttpInputStream流来进行一些处理。 保险起见,我们先看看HttpInputStream的内容吧,再作定论吧。 public override void Flush() { } public override void Close() { this.Uninit(); } protected void Uninit() { this._data = null; this._offset = 0; this._length = 0; this._pos = 0; } 最后,写出的代码类似下面的形式: |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论