Wu.Country@侠缘

勤学似春起之苗,不见其增,日有所长; 辍学如磨刀之石,不见其损,日所有亏!

ASP.net下大文件上传的几个问题讨论

我研究这个问题已经很长时间了,ASPUpload的组件以及其它几个组件都使用过,多多少少对这些组件的工作原理有些了解,对于其它一些问题的讨论也都遇到过。前几个星期开发的WebbUpload2.0经过一段时间的测试后,发现它完全是一个超级大BUG,所以放弃发布它了。(不想害人了。)

先收集一些网络上关于这个问题的一些内容:

http://blog.joycode.com/saucer/archive/2004/03/16/16225.aspx 
http://www.cnblogs.com/bestcomy/archive/2004/06/09/14267.aspx BestCompy的上传组件
http://www.cnblogs.com/lion.net/archive/2004/07/14/24294.aspx lion 的上传组件
http://www.voidland.com/blog/article.asp?id=22


一般情况下,用ASP,net上传大文件会遇到以下几个问题:
1、无法Catch的页面找不到错误,一般会是DNS错误,这里有一个小讨论。
http://koffer.cnblogs.com/archive/2005/04/21/142799.aspx

2、还会遇到这样的几个问题:
Action cancled,我在测试WebbUpload2.0的时候遇到多次,跟踪的LOG发现是用户取消了上传。然而这是不可能的,唯一的可能就是IIS自动取消了用户上传。

还有一个错误就是:The page cannot be displayed
这个错误我也遇到过N次。而且为此郁闷了好几天。

总结一下问题:
首先要明确,在网络环境不是很坏的情况下,我们是可以在ASP.net下上传超级大文件的。BestCompy的组件就是一个很好的例子,然而对于出现的问题,我们要明确原因,然后再来处理。
1、Action canceled问题,
出现这一问题其实只有一种情况,就是在实现HttpMoudule的时候,出现程序错误。这时候IIS直接返回Action canceled,而不再生成逻辑页面。我在调试程序的时候发现,不仅在HttpModule里出现错误时,页面直接Cancel掉,而且在它的子函数里出现任何错误都一样!
有一个解决方法可以显示的让页面报误,就是大块的Catch,把整个Module Catch住,然后抛出自己的异常,这样会在进度条显示页面上看到这个错误。(不知道为什么会是在进度条页面上)。而上传页面上只有一个action canceled错误,但在访问其它页面前,它会快速的显示一下自己定义的错误。
因此解决这一问题的唯一方法就是:确保你的上传模块不能有任何的错误,否则IIS就直接Cancel掉了。注意:是在传超级大文件时(>100MB)。其它的不与讨论。

还有个错误就是The page cannot be displayed,报DNS错误。这个错误我一直不知道为什么,后来跟踪IIS内存,发现上传过程中,消耗过大时,IIS的进程会消失一次!不用说,就在这消失的一瞬间,页面找不到了(很正常不是吗?)。在MSDN上找到了相关的说明:
http://support.microsoft.com/kb/893227
这给我们的程序设计出了个大难题,我的WebbUpload2.0失败之处就是内存占用太大了,在上传1G的文件时,内存直线上升,到300MB的时候,IIS就闪了一次,于是出现页面找不到。跟踪发现在算法只一味的追求速度,而没有管内存。这是一个失败的做法!也让自己清醒了一次。
知道错误以后,就可以自己解决问题。

posted on 2006-06-29 11:38 Wu.Country@侠缘 阅读(1611) 评论(7)  编辑 收藏

评论

#1楼  2006-07-04 16:04 jlbs_wang [未注册用户]

您好侠缘,在您的WebbUpload1中有个问题,不知道您发现了没有,如果上传页面包含多行文本控件,那么在输入文本回车换行时,提交表单后,换行就没有,如果回车两次就可以保留一个换行,本来我想自己改改,可惜自己水平有限,不知道您能解决了吗?
您的共享精神很可贵!   回复  引用    

#2楼 [楼主] 2006-07-05 17:00 Wu.Country@侠缘      

这个问题我在使用的时候已经注意到了,而且在第一版里已经修改过了。只是源码发布的早,有些问题没有更正。
你可以关注一下我今后几天的POST,我会在一个星期内发布WebbUpload2.0,这个版本是经过(相对于原来的要专业的点的)测试的,应该比上一些版本好一些,但使用上略有一点不用。   回复  引用  查看    

#3楼  2006-07-10 14:59 jlbs_wang [未注册用户]

好的,谢谢   回复  引用    

#4楼  2007-03-02 15:53 阿蒙 [未注册用户]

你好,在使用你的上传组件的时候遇到一个问题
在有些机器上是可以正常运作的
但是在服务器上却有些问题,主要表现就是不产生临时文件,同时进度条也不现实进度,我想可能是因为目录权限的问题
我按照可以正常运行的机器的权限配置了服务器,但是依然无法正常工作。
主要的三个权限如下:
Administrators的完全控制
Users 的一般权限(后来改为完全控制,仍然不行)
System的完全控制

不知道还有什么地方的权限需要配制?望指教!   回复  引用    

#5楼  2007-03-02 15:57 阿蒙 [未注册用户]

补充一下,虽然不产生临时文件,但是仍然可以上传成功~
这正式奇怪的地方,因为临时文件下的文件是用file.MoveTo()方法移动到上传文件夹的,如果没有产生临时文件,为什么会移动成功呢?   回复  引用    

#6楼  2007-03-30 13:15 高海东      

为什么在模态窗口中不能上传那   回复  引用  查看    


标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印