ASP无组件上传的原理

社区服务
高级搜索
猴岛论坛电脑百科ASP无组件上传的原理
发帖 回复
倒序阅读 最近浏览的帖子最近浏览的版块
5个回复

ASP无组件上传的原理

楼层直达
beiwei1937

ZxID:10536036

等级: 少校
其实,很多事情看得通透,不想讲而已。。。
举报 只看楼主 使用道具 楼主   发表于: 2012-04-28 0
无组件上传一直是困扰大家的一个问题。其实原理非常简单,核心就是分析字符串。不过,实际操作时,却困难重重。其中的关键问题还是大家往往对原理的剖析不够深入,或是因为过程过于繁琐。

  客户端HTML使用post表单的方法上传文件,要浏览上传附件,我们通过<input type="file">元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data"。

  后台asp程序中,以前获取表单提交的ASCII 数据,非常的容易。但是如果需要获取上传的文件,就必须使用Request对象的BinaryRead方法来读取。BinaryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的是,一旦使用BinaryRead 方法后,再也不能使用Request.Form 或 Request.QueryString 集合了。结合Request对象的TotalBytes属性,可以将所有表单提交的数据全部变成二进制,不过这些数据都是经过编码的。首先让我们来看看这些数据是如何编码的,有无什么规律可循,编段代码,在代码中我们将BinaryRead读取的二进制转化为文本,输出出来,在后台的upload.asp中(注意该示例不要上传大文件,否则可能会造成浏览器死掉)。

  要实时反映进度条,实质就是要实时知道当前服务器获取了多少数据?再回想一下我们实现上传的过程,我们是通过Request.BinaryRead(Request.TotalBytes)来实现的,在Request的过程中我们无法得知当前服务器获取了多少数据。所以只能通过变通的方法了,如果我们可以将获取的数据分成一块一块的,然后根据已经上传的块数我们就可以算出来当前上传了多大了!也就是说,如果我1K为1块,那么上传1MB的输入流就分成1024块来获取,例如我当前已经获取了100块,那么就表明当前上传了100K.当我提出分块的时候很多人觉得不可思议,因为他们都忽略BinaryRead方法不仅是可以读取指定大小,而且可以连续读取的。

  通过Request.BinaryRead获取提交数据,分离出上传文件后,根据数据类型的不同,保存方式也不同:对于二进制数据,可以直接通过ADODB.Stream对象的SaveToFile方法,将二进制流保存成为文件。对于文本数据,可以通过TextStream对象的Write方法,将文本数据保存到文件中。

  对于文本数据和二进制数据,是可以方便的相互转换的,对于上传小文件来说,两者基本上没什么差别。但是两种方式保存时还是有一些差别的,对于ADODB.Stream对象,必须将所有数据全部装载完才可以保存成文件,所以使用这种方式如果上传大文件将很占用内存,而对于TextStream对象,可以在文件创建好后,一次Write一部分,分多次Write,这样的好处是不会占用服务器内存空间,结合上面分析的分块获取数据原理,我们可以每获取一块上传数据就将之Write到文件中。我曾做过试验,同样本机上传一个200多MB的文件,使用第一种方式内存一直在涨,到最后直接提示计算机虚拟内存不足,最可恨是即使进度条表示文件已经上传完,但是最终文件还是没有保存上。而使用后一种方法,上传过程中内存基本上无什么变化。

  原理基本上是说清楚了,但是实际代码要比这复杂的多,要考虑很多问题,最麻烦在分析数据那部分,对于每一块获取的数据,要分析是不是属于描述信息,是表单项目还是上传的文件,文件是否已经上传结束……

  相信根据上面的描述,您也可以开发出您自己功能强大的无组件上传组件。
本帖de评分: 1 条评分 DB +8
DB+8 2012-04-28

谢谢分享,电脑技术板块欢迎你!

我就是那永远的路人甲…事件记录http://www.dashijian.org/
西小夏

ZxID:15629045

等级: 元老
配偶: 璃鱼浅析
一转眼2024了..

举报 只看该作者 沙发   发表于: 2012-04-28 0
谢谢分享,电脑技术板块欢迎你!
純潔の龍兒

ZxID:9580750

等级: 元帅

举报 只看该作者 板凳   发表于: 2012-04-28 0
=。=HTML的表单,ASP.net的技术应用。还是php与jsp的技术好。现在asp都是落伍技术了。
砖头。

ZxID:18048683

等级: 少尉
举报 只看该作者 地板   发表于: 2012-04-28 0
类3D战斗 《三界》开启极致战斗体验类3D战斗 《三界》开启极致战斗体验
肖超白痴

ZxID:17377860

等级: 上等兵
举报 只看该作者 4楼  发表于: 2012-04-28 0
嘿咻DB
肖超白痴

ZxID:17377860

等级: 上等兵
举报 只看该作者 5楼  发表于: 2012-04-28 0
黑锡
« 返回列表
发帖 回复