纯ASP分离FORM数据中的二进制文件和文本数据
类别: ASP教程
以下源代码为一个文件
<%
\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'
\'功能:纯asp分离FORM数据中的二进制文件和文本数据(支持中文)。
\'使用方法:将此文件包含在处理form的asp文件中,使用GetValue(name)来读取表单中各个元素的值。
\'注意:一定不要使用request.form来读取数据。
\'在绝大数的支持asp的主页空间仅能使用有限的组件,不能使用上传组件,而内置的Request对象又不
\'支持读取二进制文件,因此使用该文件可以解决上传文件困难的弊病,但在性能上却大打折扣。本程序参考了网上的一些代码。
\'由GBK向UNICODE转换
Function GBToU(BinStr,byteNum)
GBToU=""
For j=1 To byteNum
gbcode1=AscB(MidB(BinStr,j,1))
If gbcode1>&H80 Then
gbcode2=AscB(MidB(BinStr,j+1,1))
a=gbcode1-&H81
b=gbcode2-&H40
If gbcode2>&H7f Then b=b-1
GBToU=GBToU & ChrW(GB2U(a*190+b)) \'GB2U为转换表
j=j+1
Else
GBToU=GBToU & ChrW(AscB(MidB(BinStr,j,1)))
End If
Next
End Function
\'得到边界字符串
boundary=Mid(Request.ServerVariables("CONTENT_TYPE"),31)
\'Form中数据的字节数
byteCount=Request.TotalBytes
\'Form中的二进制数据
binRead=Request.BinaryRead(byteCount)
\'边界ASCII字符串
endStr=ChrB(13)&ChrB(10)&ChrB(45)&ChrB(45)
For i=1 To Len(boundary)
endStr=endStr&ChrB(AscB(Mid(boundary,i,1)))
Next
Dim FormValue(31,3)
Dim byteI \'字节指针
E=0
byteI=37+Len(boundary) \'第一个元素数据开始处
Do While byteI<byteCount
If AscB(MidB(binRead,byteI,1))=110 Then \'元素数据存在
FormValue(E,0)=""
FormValue(E,1)=""
FormValue(E,2)=""
FormValue(E,3)=""
byteI=byteI+6 \'名字开始处
nameStart=byteI
byteI=InStrB(byteI,binRead,ChrB(34)) \'名字结束处
nameLen=byteI-nameStart \'名字长度
FormValue(E,0)=GBToU(MidB(binRead,nameStart,nameLen),nameLen) \'读入名字
If AscB(MidB(binRead,byteI+1,1))=13 Then \'元素为文本
byteI=byteI+5 \'文本数据开始处
dataStart=byteI
byteI=InStrB(byteI,binRead,endStr) \'文本数据结束处
dataLen=byteI-dataStart \'文本数据长度
FormValue(E,1)=GBToU(MidB(binRead,dataStart,dataLen),dataLen) \'读入文本数据
Else \'元素为文件
byteI=byteI+13 \'路径开始处
pathStart=byteI
byteI=InStrB(byteI,binRead,ChrB(34)) \'路径结束处
pathLen=byteI-pathStart
FormValue(E,2)=GBToU(MidB(binRead,pathStart,pathLen),pathLen) \'读入路径
byteI=byteI+17 \'文件类型开始
typeStart=byteI
byteI=InStrB(byteI,binRead,ChrB(13)) \'文件类型结束处
typeLen=byteI-typeStart \'文件类型长度
FormValue(E,3)=GBToU(MidB(binRead,typeStart,typeLen),typeLen) \'读入文件类型
byteI=byteI+4 \'文件数据开始处
dataStart=byteI
byteI=InStrB(byteI,binRead,endStr) \'文件数据结束处
dataLen=byteI-dataStart \'文件数据长度
FormValue(E,1)=MidB(binRead,dataStart,dataLen) \'读入文件数据
End If
byteI=byteI+38+Len(boundary) \'移向下一元素数据开始处
E=E+1
Else
Exit Do
End If
Loop
\'根据元素名来检索元素数据
\'如果表单元素为文本数据直接返回其值
\'如果表单元素为二进制数据文件,则返回一3元素数组,第一个元素为文件的二进制数据,
\'第二个元素为文件的路径,第三个为文件的类型。
Function GetValue(name)
For i=0 To 31
If StrComp(FormValue(i,0),name,1)=0 Then
If FormValue(i,3)="" Then
GetValue=FormValue(i,1)
Else
GetValue=Array(FormValue(i,1),FormValue(i,2),FormValue(i,3))
End If
Exit Function
End If
Next
GetValue=Null
End Function
%>
<%
\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'\'
\'功能:纯asp分离FORM数据中的二进制文件和文本数据(支持中文)。
\'使用方法:将此文件包含在处理form的asp文件中,使用GetValue(name)来读取表单中各个元素的值。
\'注意:一定不要使用request.form来读取数据。
\'在绝大数的支持asp的主页空间仅能使用有限的组件,不能使用上传组件,而内置的Request对象又不
\'支持读取二进制文件,因此使用该文件可以解决上传文件困难的弊病,但在性能上却大打折扣。本程序参考了网上的一些代码。
\'由GBK向UNICODE转换
Function GBToU(BinStr,byteNum)
GBToU=""
For j=1 To byteNum
gbcode1=AscB(MidB(BinStr,j,1))
If gbcode1>&H80 Then
gbcode2=AscB(MidB(BinStr,j+1,1))
a=gbcode1-&H81
b=gbcode2-&H40
If gbcode2>&H7f Then b=b-1
GBToU=GBToU & ChrW(GB2U(a*190+b)) \'GB2U为转换表
j=j+1
Else
GBToU=GBToU & ChrW(AscB(MidB(BinStr,j,1)))
End If
Next
End Function
\'得到边界字符串
boundary=Mid(Request.ServerVariables("CONTENT_TYPE"),31)
\'Form中数据的字节数
byteCount=Request.TotalBytes
\'Form中的二进制数据
binRead=Request.BinaryRead(byteCount)
\'边界ASCII字符串
endStr=ChrB(13)&ChrB(10)&ChrB(45)&ChrB(45)
For i=1 To Len(boundary)
endStr=endStr&ChrB(AscB(Mid(boundary,i,1)))
Next
Dim FormValue(31,3)
Dim byteI \'字节指针
E=0
byteI=37+Len(boundary) \'第一个元素数据开始处
Do While byteI<byteCount
If AscB(MidB(binRead,byteI,1))=110 Then \'元素数据存在
FormValue(E,0)=""
FormValue(E,1)=""
FormValue(E,2)=""
FormValue(E,3)=""
byteI=byteI+6 \'名字开始处
nameStart=byteI
byteI=InStrB(byteI,binRead,ChrB(34)) \'名字结束处
nameLen=byteI-nameStart \'名字长度
FormValue(E,0)=GBToU(MidB(binRead,nameStart,nameLen),nameLen) \'读入名字
If AscB(MidB(binRead,byteI+1,1))=13 Then \'元素为文本
byteI=byteI+5 \'文本数据开始处
dataStart=byteI
byteI=InStrB(byteI,binRead,endStr) \'文本数据结束处
dataLen=byteI-dataStart \'文本数据长度
FormValue(E,1)=GBToU(MidB(binRead,dataStart,dataLen),dataLen) \'读入文本数据
Else \'元素为文件
byteI=byteI+13 \'路径开始处
pathStart=byteI
byteI=InStrB(byteI,binRead,ChrB(34)) \'路径结束处
pathLen=byteI-pathStart
FormValue(E,2)=GBToU(MidB(binRead,pathStart,pathLen),pathLen) \'读入路径
byteI=byteI+17 \'文件类型开始
typeStart=byteI
byteI=InStrB(byteI,binRead,ChrB(13)) \'文件类型结束处
typeLen=byteI-typeStart \'文件类型长度
FormValue(E,3)=GBToU(MidB(binRead,typeStart,typeLen),typeLen) \'读入文件类型
byteI=byteI+4 \'文件数据开始处
dataStart=byteI
byteI=InStrB(byteI,binRead,endStr) \'文件数据结束处
dataLen=byteI-dataStart \'文件数据长度
FormValue(E,1)=MidB(binRead,dataStart,dataLen) \'读入文件数据
End If
byteI=byteI+38+Len(boundary) \'移向下一元素数据开始处
E=E+1
Else
Exit Do
End If
Loop
\'根据元素名来检索元素数据
\'如果表单元素为文本数据直接返回其值
\'如果表单元素为二进制数据文件,则返回一3元素数组,第一个元素为文件的二进制数据,
\'第二个元素为文件的路径,第三个为文件的类型。
Function GetValue(name)
For i=0 To 31
If StrComp(FormValue(i,0),name,1)=0 Then
If FormValue(i,3)="" Then
GetValue=FormValue(i,1)
Else
GetValue=Array(FormValue(i,1),FormValue(i,2),FormValue(i,3))
End If
Exit Function
End If
Next
GetValue=Null
End Function
%>
- 上一篇: 利用HTTP组件来实现页面打印的一种方法
- 下一篇: 利用XML技术获取域名的世界排名数字
-= 资 源 教 程 =-
文 章 搜 索