ASP无组件上传的原理
来源:互联网 发布:pandorabox域名过滤 编辑:程序博客网 时间:2024/06/05 05:03
无组件上传一直是困扰大家的一个问题。其实原理非常简单,核心就是分析字符串。不过,实际操作时,却困难重重。其中的关键问题还是大家往往对原理的剖析不够深入,或是因为过程过于繁琐。
客户端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的文件,使用第一种方式内存一直在涨,到最后直接提示计算机虚拟内存不足,最可恨是即使进度条表示文件已经上传完,但是最终文件还是没有保存上。而使用后一种方法,上传过程中内存基本上无什么变化。
原理基本上是说清楚了,但是实际代码要比这复杂的多,要考虑很多问题,最麻烦在分析数据那部分,对于每一块获取的数据,要分析是不是属于描述信息,是表单项目还是上传的文件,文件是否已经上传结束……
相信根据上面的描述,您也可以开发出您自己功能强大的无组件上传组件。
- asp无组件上传的原理 (转)
- >+ asp无组件上传的原理 (转)
- asp无组件上传的原理
- asp无组件上传的原理
- asp无组件上传的原理 (转)
- asp无组件上传的原理
- asp无组件上传的原理
- asp无组件上传的原理 (转)
- asp无组件上传的原理
- ASP无组件上传的原理
- ASP无组件上传的原理
- asp实现无组件上传文件原理
- ASP 无组件上传
- asp无组件上传
- Asp无组件上传
- asp无组件上传
- asp无组件上传
- asp无组件上传
- 得到保存在assets目录下的txt文件的内容
- 程序员自我修养-CRT中的多线程
- 【摘抄】生活简单明了,享受人生守住30%便好。人生苦短,总会到站!
- 随想录(开源代码的学习方法)
- Android UI布局整理
- ASP无组件上传的原理
- php实现文件上传进度条 .
- Excel转换成Xml
- IBM Power7走向优化服务
- API hook原理和实例快速入门(inline hook),以dll线程注入方式使用(win7-64bit)
- ping脚本
- VMware网络设置详解 打造超级虚拟网络--全面
- 2012年7月发布的中国企业500强排行榜名单 .
- oracle中查询所有用户表的表名、主键名称、索引、外键等