上传文件硬盘内存消失失还占空间

最近看见有人在研究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("")] public HttpPostedFile PostedFile { &get { return this.Context.Request.Files[this.RenderedNameAttribute]; } } 可以看出,实际上是一个HttpPostedFile类实例,那么要明白它的工作原理,肯定就要追到HttpPostedFile类去看看。
好了,我们再看看,这个HttpPostFile中提供的SaveAs()的代码: public void SaveAs(string filename) { &HttpRuntimeSection section1; &if (!Path.IsPathRooted(filename))& { &&section1 = RuntimeConfig.GetConfig().HttpR&&if (section1.RequireRootedSaveAsPath) &&{&&& throw new HttpException(HttpRuntime.FormatResourceString("SaveAs_requires_rooted_path", filename));&&}& }& FileStream stream1 = new FileStream(filename, FileMode.Create);& try & {& &&this._stream.WriteTo(stream1);&&stream1.Flush();&&& }& finally & { &&stream1.Close();& }}
注意,用标记的那一句,观看整个代码,可以发现的是:实际上,在SavaAs方法中,处理的流是在此方法中新建的一个FileStream的实例,这里只有stream1.Flush(),而this._stream所指向的实例实际上还存在于缓存中,它才是真正占用了大量内存空间的罪人。
好了,再看看HttpPostedFile的构造函数,就可以知道this._stream是从哪里来的了. internal HttpPostedFile(string filename, string contentType, HttpInputStream stream)&{& this._filename = & this._contentType = contentT& this._stream =&} 嗯?原来如此,这里的流对象原来也只是一个引用罢了,真正的占用内存的杀手在哪儿?看样子,只要知道了是谁创建了HttpPostedFile这个类的实例,谁就是罪魁祸首。
不过,这里,我们要暂放一步,目前我们基本知道了实际上进行SaveAs方法后,缓存中的数据并没有被清除,相反的,它还好好地留在内存中。 我们的目标是要解决这个问题,正好,在HtmlInputFile中也给出了所创建的实例的引用,所以,现在,针对HttpInputStream流来进行一些处理。
保险起见,我们先看看HttpInputStream的内容吧,再作定论吧。
public override void Flush() { } @#%*&@,Flush方法居然是这样写的,嗯,以后要注意了!
public override void Close() { this.Uninit(); } 这是Close方法,里面调用了Uninit(),所以,我们再看看Uninit.
protected void Uninit() { this._data = this._offset = 0; this._length = 0; this._pos = 0; } Mmmm,虽然感觉有点不爽,但起码使用这个方法时,这个方法能够保证它会把缓存对象清空。
最后,写出的代码类似下面的形式: private void btnUpLoad_ServerClick(object sender, System.EventArgs e) {& &try &{&& string strFileName = new FileInfo(imageUpload.PostedFile.FileName).N&& UploadFile.PostedFile.SaveAs("C:\\"+strFileName);&& Response.Write("上传成功!"); &} &catch &{ &&Response.Write("上传失败!"); &} &finally &{&&&&HttpInputStream upStream = imageUpload.PostedFile.InputS&& upStream.Close();& }}经过测试,发现这样也不是一个理想的方案,还必须进一步补充才行。过程如下:在本机上,浏览FileUpload.aspx,此时,w3wp进程占用内存空间为28,948K当上传一个12.7M的文件后,据返回的信息表示,上传的文件大小为,内存占用变化为49,312K。再上传一个一个371K的文件,据返回的信息表示,上传的文件上小为3799041,内存占用此时为31,540K似乎达到了我们的要求,但这里有一个问题就是,当你上传一个大文件后,没有再上传一个小文件的话,那么这个大文件将会在内存里一直占用空间,不知,是否还有更好的办法去解决,现在快1点了,睡觉,以后再说。
阅读(...) 评论() &我怎么把我空间绿钻上传的歌全删了怎么还占着内存?_百度知道
我怎么把我空间绿钻上传的歌全删了怎么还占着内存?
提问者采纳
你到QQ空间.. 按音乐盒 你会看到背景音乐左边那个我的音乐 如果你是本地上传就去本地音乐里删歌。QQ播放器就到我喜欢 收藏列表删
提问者评价
其他类似问题
绿钻的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁为什么我在电脑上传输文件时看到手机内存空间总共只有12G的,怎么回事??_产品专区_大神F2_酷友社区_大神论坛_酷派官方论坛
后使用快捷导航没有帐号?
与更多酷友一起玩转社区
才可以下载或查看,没有帐号?
我的是F2&&盒子上明明说有16G的&&求助!!!&&
来自大神F2联通版(酷友社区5.2.4版)
LV9.圣翼神族
12g属于正常
来自大神F1联通版(酷友社区5.3.5版)
回炉从造 发表于
12g属于正常怎么这样说,盒子上说总内存有16G的
来自大神F2联通版(酷友社区5.2.4版)
那些被系统和应用占据了!
来自大神F2联通版(酷友社区5.3.5版)
楼主没文化 真可怕
来自大神F2(酷友社区5.3.7版)
版块推荐百宝箱
为了让小伙伴不错过每一个精彩活动,小编持续给您更新【进行中】的活动,中奖机会大大的有!
酷派,我们一起成长
只为热衷手机游戏的你
手机同步.新时代打开最美,放飞好心情无限量 零距离分享
酷派官方精品配件
|备案证号: 粤ICP备号-1&&Copyright (C) 宇龙计算机通信科技(深圳)有限公司东西传到手机内存卡上,拔掉数据线用手机看,自己建的文件夹还在,里面东西没了,也没占用空间这是怎么回
东西传到手机内存卡上,拔掉数据线用手机看,自己建的文件夹还在,里面东西没了,也没占用空间这是怎么回
LZ你好,有时候可能是电脑的问题,有时候复制比较大的文件的时候,会出现过了一会才弹出复制东西的那个窗口。还有就是,复制的东西是你手机不支持的软件,建议:以后复制文件以后,等一会在看,如果在电脑上看有的话,就看一下已经复制过去的文件的大小,USB没有那么快,所以以后要看好了,才能拔掉手机!还要记住,一定要点右下角的移除后才能拔掉数据线,不然会造成手机只要一连上电脑就会让电脑死机的现象,我以前可经受过!
相关知识等待您来回答
手机领域专家
当前分类官方群讨论、解答、交流电脑数码相关的疑难问题您还未登陆,请登录后操作!
里面的电影上传到了百度云还是占内存空间?删除本地的后在百度云就不能观看了怎么回事?
空间因为没有删除,你删除后不能看是因为没有联网,需要联网在下载次才能看的
您的举报已经提交成功,我们将尽快处理,谢谢!
因为你之前下载在内存里,没有删除,删除了之后在百度云看是在线看的,连接网络
大家还关注}

我要回帖

更多关于 硬盘内存消失 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信