vbscript|vbscript从浏览器上载文件是从客户机向服务器传递文件的一个简易方法。从第三代浏览器Netscape和 Microsoft起,多数浏览器都可以向服务器上载文件,而不需要向用户提供特殊的访问方式或软件。
一些ASP组件是为文件上载而设计的,例如:
Posting Acceptor
( Microsoft SiteServer的一部分),
AspSmartUpload(Advantys),
AspUpload (PersistsSoftware),
SA-FileUpSoftware Artisants)
本文的开始将告诉你关于创建这类组件的信息,而这些组件通常使用VB、C++或Java。
这些组件的问题在于它们是第三方产品而非标准ASP的一部分。作为第三方组件,必须在服务器上进行安装。这就意味着必须在服务器上复制DLL并注册。大多数的主机系统不允许在他们的服务器上进行这样的设置,因为有可能发生配置问题(尤其是虚拟主机)。第二个缺点是它们大部分不是免费的,不提供源代码,也就不能根据需要进行定制。
因此我需要编写VBScript代码来解决文件上载的问题。这不是一个必然的选择,因为VBScript是一种脚本语言,只能使用variants数据类型,并且不能提供许多管理二进制数据和字节数组的内置函数。
要理解上载的过程,首先要知道数据用HTTP协议从浏览器发送到服务器的方式。这就意味着要理解“ multipart/form-data” (多部分/格式-数据)的表单提交。
上载表单
通常情况下,使用HTML表单从浏览器向服务器传递数据。这个表单中可能包含文本域、检验框、按钮以及上载文件的文件类型控制。使用者用自己的数据填充并将这个表提交给服务器。
表单元素中的 enctype 属性规定了传递给服务器的表数据集编码的内容类型。enctype 属性的默认值是“application/x-www-form-urlencoded”,但当向服务器传送大量文本、包含非ASCII字符或二进制数的数据时,这个默认类型就不能胜任了。这时,文件上载提交表单时应使用“multipart/form-data”内容类型。
一个“multipart/form-data”信息包含一系列部件,每个部件都可能包含:
一个Content-Disposition(内容-处理)头,其值为"form-data" ;一个规定控制名的name(名称)属性。
对于一个文件类型控制,一个部件可能包含更多信息:
在客户机上规定原始路径和文件名的filename(文件名)属性;所发送的二进制数据控制的Content-Type (内容-类型)头。
在这些头的后面跟随着控制的二进制或文本内容。
以下例子说明“multipart/form-data”的编码,客户机的浏览器应有这个表单:
如果这个表单被提交,在服务器上可读到这些请求:
-----------------------------7cf87224d2020a
Content-Disposition: form-data; name="email"
PhCollignonemail.com
-----------------------------7cf87224d2020a
Content-Disposition: form-data; name="blob"; filename="c:\image.gif"
Content-Type: image/pjpeg
-----------------------------7cf87224d2020a
Content-Disposition: form-data; name="Enter"
Submit Query
-----------------------------7cf87224d2020a--
当那个内容作为响应被传送回客户机时就会被显示出来。应该用Request.binaryRead 和Response.binaryWrite 方法读和写二进制数据。
〈%
Response.BinaryWrite(Request.BinaryRead(Request.TotalBytes))
%〉
可以看到响应的各部分用分界线来划分:
-----------------------------7cf87224d2020a
最后一个分界线后面跟随的是’ -- ’ 。
每一个控制都有一个Content-Disposition 。name属性识别由HTML表发送的控制(email、blob和Enter)。 对于一个文件类型控制(blob),
文件名也是Content-Disposition 头的一部分,Content-Type 头给出二进制 数据的内容类型。
上载脚本
上面所有内容都必须经过分解。在VB 或 C++中, 这非常明显,因为为此提供了许多对象和方法。在VBScript 中,必须使用语言所提供的一些函数,并要解决VBScript中使用的双字节编码的变量字符串的问题。
VBScript函数
原始数据是二进制格式,所以必须使用专为管理二进制数据而设计的VBScript函数。因为我们将原始数据作为一个字节的字符串来考虑, 所以 MidB、InstrB 和 LenB 函数就有用了。 但是要避免VBScript的classic字符串,因为它们是双字节编码的字符串,不适宜分解成单字节。
这些是VBScript函数中仅有的用来分解字节的函数。还需要一个方法,从被分解的数据中得到双字节编码的字符串,这样就可以使用VBScript编码中的字符串了。为了在InstrB中把字符串作为一个自变量使用,还需要一个函数,把双字节字符串转换成单字节字符串。
为了我写了两个函数,getString() 和 getByteString(),稍后再对此进行解释。
结构
分解的数据被存储在VBScript Dictionary 对象中。 Dictionary 对象是hash 表对象,它存储(key, item)对。它是VBScript和ASP2.0的一部分。
定义第一个Dictionary 对象 " UploadRequest " 。这个对象包含由上载表提交的所有控制。Key是控制的名字,Item则是对象中所包含的控制的信息:
"ControlName1", Dictionary control1
"ControlName2", Dictionary control2
代表一个控制的Dictionary 对象包含着下面的(key, item) 对:
"Value", String or binary content
"FileName", Name of uploaded file
"ContentType", ContentType of uploaded file
把这些结合起来,就有以下例子:
UploadRequest : "email", UploadControl 1 : "Value", PhCollignonemail.com
"blob" , UploadControl 2 : "filename", C:/image/file.gif "ContentType" :
image/gif "Value" : GIF89ai?
这个对象对于以后存取和使用数据非常有用。
分解
这里是分解、读和记录上载控制的代码。这个过程用"BuildUploadRequest"程序来完成,这个程序只有一个自变量,就是原始二进制数据RequestBin。
Sub BuildUploadRequest(RequestBin)
首先要找到分界线,通过分界线可以知道控制循环何时结束。
’Get the boundary PosBeg = 1 PosEnd = InstrB(PosBeg,RequestBin,getByteString(chr(13)))
bou
用ASP和VBScript上载文件(一)
80酷酷网 80kuku.com