解
form-data(如果没有使用,那么下面就没必要执行啦),还可以获取边界值b
oundary=---------------------------7d429871607fe。(注意:这里获取的
边界值比上面的边界值开头要少--,最好补充上。)
至于如何分析数据的过程我就不多赘述了,无非就是借助InStr,Mid等这样的
函数来分离出来我们想要的数据。
二、分块上传,记录进度
要实时反映进度条,实质就是要实时知道当前服务器获取了多少数据?再回想
一下我们实现上传的过程,我们是通过Request.BinaryRead(Request.TotalBy
tes)来实现的,在Request的过程中我们无法得知当前服务器获取了多少数据
。所以只能通过变通的方法了,如果我们可以将获取的数据分成一块一块的,
然后根据已经上传的块数我们就可以算出来当前上传了多大了!也就是说,如
果我1K为1块,那么上传1MB的输入流就分成1024块来获取,例如我当前已经获
取了100块,那么就表明当前上传了100K。当我提出分块的时候很多人觉得不
可思议,因为他们都忽略BinaryRead方法不仅是可以读取指定大小,而且可以
连续读取的。
写个例子来验证一下分块读取的完整性,在刚才的例子基础上(注意该示例不
要上传大文件,否则可能会造成浏览器死掉):
%
Dim biData, PostData, TotalBytes, ChunkBytes
ChunkBytes = 1 1024 ' 分块大小为1K
TotalBytes = Request.TotalBytes ' 总大小
PostData = ' 转化为文本类型后的数据
ReadedBytes = 0 ' 初始化为0
' 分块读取
Do While ReadedBytes TotalBytes
biData = Request.BinaryRead(ChunkBytes) ' 当前块
PostData = PostData &; BinaryToString(biData,ChunkBytes) ' 将当前块转
化为文本并拼接
ReadedBytes = ReadedBytes + ChunkBytes ' 记录已读大小
If ReadedBytes TotalBytes Then ReadedBytes = TotalBytes
Loop
Response.Write pre &; Po
stData &; pre ' 使用pre,原样输出格式
' 将二进制流转化成文本
Function BinaryToString(biData,Size)
Const adLongVarChar = 201
Set RS = createObject(ADODB.Recordset)
RS.Fields.Append mBinary, adLongVarChar, Size
RS.Open
RS.AddNew
RS(mBinary).AppendChunk(biData)
RS.update
BinaryToString = RS(mBinary).Value
RS.Close
End Function
%
试验一下上传刚才的文本文件,输出结果证明这样分块读取的内容是完整的,
并且在While循环中,我们可以在每次循环时将当前状态记录到Application中
,然后我们就可以通过访问该Application动态获取上传进度条。
另:上例中是通过字符串拼接的,如果是要拼接二进制数据,可以通过ADODB.
Stream对象的Write方法,示例代码如下:
Set bSourceData = createobject(ADODB.Stream)
bSourceData.Open
bSourceData.Type = 1 'Binary
Do While ReadedBytes TotalBytes
biData = Request.BinaryRead(ChunkBytes)
bSourceData.Write biData '
直接使用write方法将当前文件流写入bSourceData中
ReadedBytes = ReadedBytes + ChunkBytes
If ReadedBytes TotalBytes Then ReadedBytes = TotalBytes
Application(ReadedBytes) = ReadedBytes
Loop
三、保存上传的文件
通过Request.BinaryRead获取提交数据,分离出上传文件后,根据数据类型的
不同,保存方式也不同:
对于二进制数据,可以直接通过ADODB.Stream对象的SaveToFile方法,将二进
制流保存成为文件。
对于文本数据,可以通过TextStream对象的Write方法,将文本数据保存到文
件中。
对于文本数据和二进制数据,是可以方便的相互转换的,对于上传小文件来说
,两者基本上没什么差别。但是两种方式保存时还是有一些差别的,对于ADOD
B.Stream对象,必须将所有数据全部装载完才可以保存成文件,所以使用这种
方式如果上传大文件将很占用内存,而对于TextStream对象,可以在文件创