if readedbytes > totalbytes then readedbytes = totalbytes
application("readedbytes") = readedbytes
loop
三、保存上传的文件
通过request.binaryread获取提交数据,分离出上传文件后,根据数据类型的不同,保存方式也不同:
对于二进制数据,可以直接通过adodb.stream对象的savetofile方法,将二进制流保存成为文件。
对于文本数据,可以通过textstream对象的write方法,将文本数据保存到文件中。
对于文本数据和二进制数据,是可以方便的相互转换的,对于上传小文件来说,两者基本上没什么差别。但是两种方式保存时还是有一些差别的,对于adodb.stream对象,必须将所有数据全部装载完才可以保存成文件,所以使用这种方式如果上传大文件将很占用内存,而对于textstream对象,可以在文件创建好后,一次write一部分,分多次write,这样的好处是不会占用服务器内存空间,结合上面分析的分块获取数据原理,我们可以每获取一块上传数据就将之write到文件中。我曾做过试验,同样本机上传一个200多mb的文件,使用第一种方式内存一直在涨,到最后直接提示计算机虚拟内存不足,最可恨是即使进度条表示文件已经上传完,但是最终文件还是没有保存上。而使用后一种方法,上传过程中内存基本上无什么变化。
四、未解决的难题
我在博客园上看到bestcomy描述他的asp.net上传组件是可以和sever.settimeout无关的,而在asp中我是没能做到,对于上传大文件,就只有将server.settimeout设置为一个很大的值才可以。不知道有没有比较好的解决方法。
如果我们在保存文件时,使用textstream对象的write方法,那么如果用户上传时中断了文件传输,已经上传的那部分文件还是在的,如果可以断点续传就好了。关键问题是request.binaryread方法虽然可以分块读取,但是却不能跳过某一段读取!
五、结束语