这个问题已经不是什么新鲜问题了,网上也有大把的教程,但大多数是授人以鱼,而不授人以渔,经过辛苦的资料收集,思考,调试,整理,我基本上已经把这个问题从原理上搞清楚了,现在根据我自己的理解,在范例程序的基础上,加以解释,希望能对部分网友(比我还菜的:-))有所帮助。
请诸位大虾能对其中的不正或不良这处予以指正。
程序中stream对象的用法上参考了“化境HTTP上传程序 Version 2.0”在代码,在此对稻香老农和梁无惧表示衷心的感谢和由衷的敬意。
先来分析一下,为后面的数据分析算法打点基础,以下是我摘录的一小段网页中提交的二进制数据:
-----------------------------7d31ec15102d0
Content-Disposition: form-data; name="txtTitle"
满脑的想法
-----------------------------7d31ec15102d0
Content-Disposition: form-data; name="filImage"; filename="F:\material\木纹背景\pic016.jpg"
Content-Type: image/pjpeg
? JFIF C
!!E.'.EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE?"
? } !1AQa"q2亼?#B绷R佯$3br?
侼s歊J佦=ǜ珻,%??Xm 銓鼽?幮??驲湕胄滙C?
儗 g?咶? tS?B矠:u隠c
g不t凄L琰h`啨0p
g殲41?9'$筵奆]眬?膁?摍? 渦"??
-----------------------------7d31ec15102d0
Content-Disposition: form-data; name="btnUpload"
Upload
-----------------------------7d31ec15102d0--
蓝色的字符的内容我们应该熟悉吧,中间的乱码就是 洗奈募哪谌荩涫滴颐且龅木褪墙庖欢咽萁蟹治觯舫龆晕颐怯杏玫氖荼4嫦吕淳蚈K了。分析数据就是查找一些标志性的内容,如回车换行符,“----------”符号,用两个指针确定两个位置,然后提取数据,我的算法不知道好不好,本人的数据结构是学得很烂的,十分sorry。
以下是一个完事的应用,其中的类定义可以与入另一个文件,使用的时候只要用
<!--include file="LjUpload.cls"-->
命令包含进来就可以了。
LjUpload.asp:
<%@ Language=VBScript %>
<% option explicit %>
<script language=vbscript runat=server>
private srmRequestData'adodb.stream对象,保存从form中提交来的所有数据
private adTypeBinary'adodb.stream对象的叁数:返回二进制数据
private adTypeText'adodb.stream对象的叁数:返回文本数据
private adModeRead'adodb.stream对象的叁数:对象可读
private adModeWrite'adodb.stream对象的叁数:对象可写
private adModeReadWrite'adodb.stream对象的叁数:对象可读写
class LjUpload'定义 桓隼啵莆狶jUpload。
private bytCrLf'单字节的回车换行符,共2字节
private bytSub'单字节的“-”符号,共8字节
private binData'二进制数据变量,保存一个提交数据的复本,便於操作
private dicForm'保存form文本域的信息
private dicFile'保存form文件域的信息
private strName'form表单的输入域名称
private strValue'form表单的输入域值
private objFile'文件信息对象,保存文件相关的信息,具体叁看class LjFile的定义
private posB'二进制数据读写指针,开始指针
private posE'二进制数据读写指针,结束指针
public Charset'语言属性设置
private sub Class_Initialize'类初始化过程
bytCrLf = getSBfromDB(vbcrlf)
bytSub = getSBfromDB("--------")
Charset = "gb2312"'默认语言属性设置为简体中文:gb2312
adTypeBinary = 1'返回二进制数据
adTypeText = 2'返回文本数据
adModeRead = 1'对象数据可读
adModeWrite = 2'对象数据可写
adModeReadWrite = 3'对象数据可读写
end sub
public sub GetData'类的打开过程,上传文件及分析数据的过程
set srmRequestData = server.CreateObject("adodb.stream")'建立一个adodb.stream对象
srmRequestData.Type = adTypeBinary'指定返回数据类型
srmRequestData.Mode = adModeReadWrite'指定打开模式
srmRequestData.Open'打开对象
srmRequestData.Write request.BinaryRead(request.TotalBytes)'获取所有form提交的数据
srmRequestData.Position = 0'读写指针重新定位至对象头部,写数据,指针已指向对象尾
binData = srmRequestData.Read'在变量中保存提交数据的复本,便於操作
set dicForm = server.CreateObject("scripting.dictionary") '用来保存文本信息
set dicFile = server.CreateObject("scripting.dictionary") '用来保存文件信息
posB = instrb(binData,bytSub)'开始分析所获取的二进制数据
posB = instrb(posB,binData,bytCrLf) + 2 '+2是加入回车换行符本身的长度
posB = instrb(posB,binData,getSBfromDB("name=""")) + 6
do until posB = 6'控制条件的设置有多种方式,这里的仅供叁考
posE = instrb(posB,binData,getSBfromDB(""""))
strName = getTextfromBin(srmRequestData,posB,posE-posB)
posB = posE + 1 '指针移动到“"”的後面
posE = instrb(posB,binData,bytCrLf)
if instrb(midb(binData,posB,posE-posB),getSBfromDB("filename=""")) > 0 then '这是一个file域
posB = instrb(posB,binData,getSBfromDB("filename=""")) + 10
posE = instrb(posB,binData,getSBfromDB(""""))
set objFile = new LjFile'建立一个文件信息对象
if posE>posB then
objFile.FileName = getFileNamefromPath(getTextfromBin(srmRequestData,posB,posE-posB))'写入文件名称
posB = instrb(posB,binData,getSBfromDb("Content-Type:")) + 14
posE = instrb(posB,binData,bytCrLf)
objFile.ContentType = getTextfromBin(srmRequestData,posB,posE-posB)'写入文件类型
posB = posE + 4'这个地方换了两行,具体叁看输出的原始二进制数据
posE = instrb(posB,binData,bytSub)
objFi















