每一个控制都有一个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", PhCollignon@email.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))) boundary = MidB(RequestBin,PosBeg,PosEnd-PosBeg) boundaryPos = InstrB(1,RequestBin,boundary) 有一个问题是InstrB需要单字节字符串作为自变量。为此写了一个函数:getByteString(String) ,此方法可以把VBScript的双字节字符串转换成单字节字符串。在代码解释的最后再描述这个函数。 在找到结束分界线之前进行下列循环: ’Get all data inside the boundaries Do until (boundaryPos=InstrB(RequestBin,boundary & getByteString("--"))) 循环中的每一步都处理一个控制。有关这一控制的所有数据都保存在dictionary对象中。每一个循环创建一个新的dictionary对象UploadControl。 ’Members variable of objects are put in a dictionary object Dim UploadControl Set UploadControl = CreateObject("Scripting.Dictionary")
(编辑:aniston)
|