以下源代碼為一個文件
<% ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' '作者:playxp,Email:playxp@sohu.com有問題請與我聯系 '功能:純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 %>
|