Windows XP是美国微软公司研发的基于X86、X64架构的PC和平板电脑使用的操作系统,于2001年8月24日发布RTM版本,并于2001年10月25日开始零售 。其名字中“XP”的意思来自英文中的“体验(Experience)” 。该系统是继Windows 2000及Windows ME之后的下一代Windows操作系统,也是微软首个面向消费者且使用Windows NT5.1架构的操作系统 。一直以来,由于FileSystemObject的局限,所以ASP最大的难题就是文件上传,大多解决法就是安装第三方上传组件 。可第三方组件有很多问题,有的组件要注册,有的组件要在表单中加上他的版权信息 。据了解,在HTTP中上传文件有三种机制:RFC1867,PUT和WebDAV 。常用的实现方法是利用在RFC1867中引入的一个新类型:File以及ADO Stream对象 。本文对上述上传方法及实现原理作了论述,并给出了具体解决实例 。
ASP FILE对象
当前,基于/模式的应用比较流行 。当用户需要将文件传输到上时,常用方法之一是运行FTP并将每个用户的FTP默认目录设为用户的Web主目录,这样用户就能运行FTP客户程序并上传文件到指定的 Web目录 。这就要求用户必须懂得如何使用FTP客户程序 。因此,这种解决方案仅对熟悉FTP且富有经验的用户来说是可行的 。如果我们能把文件上传功能与Web集成,使用户仅用Web就能完成上传任务,这对于他们来说将是非常方便的 。但是,一直以来,由于File System Object的仅能传送文本文件的局限,所以ASP最大的难题就是文件上传问题 。下面介绍的就是如何在基于HTTP协议的网页中实现文件的上传 。
一.通过HTTP上传的三种机制
通过HTTP上传有三种机制:RFC1867, PUT 和 WebDAV 。
PUT 是在HTTP 1.1引入了一个新的HTTP动词 。当web收到一个HTTP PUT和对象名字,它将会验证用户,接收HTTP流的内容,并把它直接存入web 。由于这可能会对一个web站点造成破坏,并且还会失去HTTP最大的优势:可编程性 。在PUT的情况下,自己处理请求:没有空间让CGI或者ASP应用程序介入 。唯一让你的应用程序捕获PUT的方法是在低层操作,ISAPI过滤层 。由于相应的原因,PUT的应用很有限 。
而WebDAV允许web内容的分布式认证与翻译 。它引入了几种新的HTTP动词,允许通过HTTP上传,锁定/解锁,登记/检验web内容 。Office 2000中的"Save to web" 就是通过WebDAV来实现的 。如果你所感兴趣的一切都是上传内容,WebDAV应用得非常出色,它解决了很多问题 。然而,如果你需要在你的web应用程序里面上传文件,WebDAV对你就毫无用处可言 。象HTTP PUT一样,那些WebDAV的动词是被解释的,而不是web应用程序 。你需要工作在ISAPI过滤层来访问WebDAV的这些动词,并在你的应用程序中解释内容 。
RFC1867 最终被W3C在HTML3.2中接受前,是作为一种建议标准 。它是一种非常简单但是功能很强大的想法:在表单字段中定义一个新类型 。
并且在表单本身加入了不同的编码方案,不再使用典型的:
而是使用:
这种编码方案在传送大量数据的时候,比起缺省的"application/x-url-encoded"表单编码方案,显得效率要高得多 。URL编码只有很有限的字符集,使用任何超出字符集的字符,必须用'%nn'代替,这里的nn表示相应的2个十六进制数字 。例如,即使是普通的空格字符也要用'%20'代替 。而RFC1867使用多部分MIME编码,就象通常在e-mail消息中看到的那样,不编码来传送大量数据,而只是在数据周围加上很少的简单但实用的头部 。主要的厂商都采用了建议的"浏览..."按钮,用户能很容易的使用本地"打开文件..." 对话框选择要上传的文件 。
RFC1867仍然将大多数文件上传的灵活方法留给了你的web应用程序 。PUT用得很有限 。WebDAV对内容的作者很有用,比如FrontPage用户,但是对想在web应用程序中加入文件上传的web开发者来说很少用到 。因此,RFC1867是在web应用程序中加入文件上传的最好的办法 。
在实际应用中,免费提供了Posting Acceptor。ASP不懂"multipart/form-data" 编码方案 。取而代之,提供了Posting Acceptor ,Posting Acceptor是一种在上传完成后,接受REPOST到一个ASP页的ISAPI应用程序 。Software Artisans的SA-FileUp是最早的商业Active Server之一 。几经改进,现在作为一个纯粹的ASP存在 。
二.基于ASP的文件上传实现原理分析
基本原理是:采用ADO Stream对象的BinaryRead方法将FORM中的所有数据读出,从中截取出所需的文件数据,以二进制文件方式存盘 。下面是上传文件页面的一个例子(upload.htm):
程序中使用了文件对象,这样在Upload.asp中采用BinaryRead方法读来的原始数据就不仅仅是选择的文件本身的数据,还包含该文件在用户硬盘上的路径、类型、提交页面的表单等相关信息的描述,这样我们就需从中提取出文件的具体内容 。根据分析,数据的头部信息与数据的分界线是两对回车换行符,尾部也有分隔信息,我们可以采用类似以下的方法获取文件数据 。
【结合案例区分ASP文件上传原理】Dim FormData.FormSize,DataStart,CLStr,DivStr FormSize=Request.TotalBytes FormData=http://www.win1064.cn/xparticle/Request.BinaryRead(FormSize) CLStr=ChrB(13)&ChrB(10) DataStart=InStrB(FormData.CLStr&CLStr)+4 '4是两对回车换行符的长度 DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1) DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2 FormData=MidB(FormData,DataStart,DataSize)
推荐阅读
- 分享windows自带记事本运用小窍门
- 教你aspx文件的打开方式
- 3款经常见的RAW格式图片转换工具大比拼
- 分享运用Windows自带防火墙的小窍门
- 高手预防Windows死机的24大招
- 世界真奇妙 xp系统死机变聪慧
- 解析电脑连续死机的那些原因
- 盘点windowsxp系统经常见应用秘籍
- 完全清除电脑"卧底"的木马杀手