内容提要:----目录-------- 1、前言 2、概念 3、性质和应用 -3.1 创建 -3.2 删除 -3.3 检测与提取 -3.4 保存与传输 -3.5 文件隐藏 -3.6 运行 -3.7 与IIS相关 4、附言 5、参考文章 ---------------- 1、前言 交换数据流(alt …… |
Do While ReadedBytes < TotalBytes
biData = Request.BinaryRead(ChunkBytes)
bSourceData.Write biData '' 直接使用write方法将当前文件流写入bSourceData中
ReadedBytes = ReadedBytes + ChunkBytes
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方法虽然可以分块读取,但是却不能跳过某一段读取!
五、结束语
原理基本上是说清楚了,但是实际代码要比这复杂的多,要考虑很多问题,最麻烦在分析数据那部分,对于每一块获取的数据,要分析是不是属于描述信息,是表单项目还是上传的文件,文件是否已经上传结束……
相信根据上面的描述,您也可以开发出您自己功能强大的无组件上传组件。我想更多的人关心的只是代码,而不会自己动手去写的,也许没有时间,也许水平还不够,更多的只是已经成为了一种习惯……我在CSDN上见过太多技术八股文——一段说明,然后全是代码。授人以鱼不若授人以渔,给你一个代码,也许你并不会去思考为什么,直接拿去用,当下次碰到类似的问题的时候,还是不知道为什么,希望此文能让更多人学到点什么,最重要是"悟"到点什么!
热门新闻
- 08-12-24 卡巴斯基7.0注册码
- 08-12-21 2008木马清道夫注册码
- 08-12-21 FlashFXP3.6注册码
- 09-01-09 卡巴斯基7.0授权key文件
- 08-12-21 9544提供1G免费全能空间
- 08-12-26 AVI/MPEG/RM/WMV Splitter v4.26 注册码
- 08-12-21 QQ号克隆好友
- 08-12-24 FIFA2008序列号
- 09-02-11 免费提供300M全能型空间
- 08-12-24 Windows序列号/注册码
推荐新闻
- 09-08-25 叶问
- 09-08-25 少年四大名捕 粤语版
- 09-08-19 网络安全检测思路
- 09-08-13 优化网站性能提高网站访问速度的技巧
- 09-08-12 中电华通全免费主机套餐
- 09-02-11 免费提供300M全能型空间
- 09-01-21 珠光宝气 免费在线观看
- 09-01-21 金山毒霸2009序列号
- 09-01-09 卡巴斯基7.0授权key文件
- 09-01-09 强奸陷阱