国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁(yè) > 編程 > ASP > 正文

二進(jìn)制上傳文件的實(shí)現(xiàn)方法及代碼

2024-05-04 11:07:28
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友

<Form action="upload.asp" method=post enctype="multipart/form-data">  
上傳文件:<Input type=file name=file1><br>  
<input type=submit name=upload value="上傳">  
</form>  

其中,enctype參數(shù)用來(lái)設(shè)置表單的MIME編碼方式,在進(jìn)行文件(或同時(shí)包含文本框)上傳時(shí),必須將其屬性設(shè)置為"multipart/form-data";upload.asp是服務(wù)器端對(duì)接收到的二進(jìn)制文件流進(jìn)行處理的ASP程序,在本文的后面將陸續(xù)介紹其內(nèi)容。  

2、上傳文件格式分析  

在處理文件之前,我們要先了解上傳的文件的具體格式,通過(guò)編寫(xiě)下面一段簡(jiǎn)單的ASP程序就可以查看其二進(jìn)制代碼:  

<%  
filesize=Request.TotalBytes  ’獲得上傳文件的大小  
filedata=Request.BinaryRead(filesize)  ’獲得上傳文件的二進(jìn)制數(shù)據(jù)  
Response.BinaryWrite filedata  ’在瀏覽器上顯示二進(jìn)制數(shù)據(jù)  
%>  

分析瀏覽器上顯示的上傳文件的二進(jìn)制代碼,發(fā)現(xiàn)代碼包括四個(gè)部分(若同時(shí)上傳多個(gè)文件或文本框,則代碼按上傳的先后次序排列,格式相同),每一部分的內(nèi)容是用回車(chē)換行符號(hào)來(lái)進(jìn)行分隔的:  

1)第一部分(起始標(biāo)志)  
-----------------------------7d329631b04d4  
2)第二部分(文件說(shuō)明)  

Content-Disposition: form-data; name="file1"; filename="C:/Documents and Settings/Administrator/My Documents/Invitation.doc" Content-Type: application/msword  


在此,我們可以獲得上傳文件的文件名稱(chēng)及絕對(duì)路徑,也可以獲得文件類(lèi)型。這些信息是正確保存文件所不可缺少的。  

3)第三部分(文件內(nèi)容)  

即文件的二進(jìn)制內(nèi)容,略。  

4)第四部分(結(jié)束標(biāo)志)  

-----------------------------7d329631b04d4  

結(jié)合第一部分和第四部分的內(nèi)容來(lái)看,"-----------------------------7d329631b04d4"(每次上傳,數(shù)值都不一樣)起到了分割符的作用,它標(biāo)志著一段數(shù)據(jù)(當(dāng)有多個(gè)上傳內(nèi)容時(shí))的開(kāi)始和結(jié)束。從保存文件所需要的信息來(lái)講,我們首先需要從第二部分?jǐn)?shù)據(jù)的"filename"中獲得文件名稱(chēng),然后需要正確定位文件的起始位置,最后利用ASP技術(shù)將二進(jìn)制文件用本來(lái)的文件名保存即可。若同時(shí)上傳多個(gè)內(nèi)容(如多個(gè)文本框和文件),也是按同樣的方法處理,每部分的內(nèi)容都包含在分割符之中,只是文本框和文件的表現(xiàn)形式稍有不同,這可以通過(guò)具體分析其二進(jìn)制代碼來(lái)了解。  

3、利用ASP技術(shù)實(shí)現(xiàn)文件存儲(chǔ)  

上傳文件代碼的處理  

1) 獲得分割符代碼  

從上面的分析我們已經(jīng)知道,分割符起到了分割多個(gè)數(shù)據(jù)段(包括文本框和各種類(lèi)型的文件)的重要作用。前面已經(jīng)分析過(guò),分割符出現(xiàn)在第一個(gè)回車(chē)換行符號(hào)前。因此,通過(guò)下面這段程序就可獲得分割符代碼:  

<%  
newline=chrB(13) & chrB(10)  ’newline表示二進(jìn)制的回車(chē)符  
filesize=Request.TotalBytes  ’filesize是上傳文件的大小  
filedata=Request.BinaryRead(filesize)  ’filedata是上傳文件的二進(jìn)制數(shù)據(jù)  
divider=leftB(filedata,clng(instrb(filedata,newline))-1)  ’divider是分割符  
%>  

注:因?yàn)檫@里處理的都是二進(jìn)制字節(jié)碼,因此,所有的函數(shù)都是使用它的二進(jìn)制版本,加了"b "。  

2) 獲得文件(或文本框)內(nèi)容  

(1) 預(yù)備函數(shù)(將二進(jìn)制串轉(zhuǎn)化成字符串)  

上傳文件的內(nèi)容不需要經(jīng)過(guò)二進(jìn)制向字符串的轉(zhuǎn)換過(guò)程,直接保存就可。但是,若需提取文本框內(nèi)容或文件的名稱(chēng),就必須進(jìn)行轉(zhuǎn)換。因此,需要編寫(xiě)一個(gè)通用的,并且適用于漢字的轉(zhuǎn)換函數(shù)。以下是該函數(shù)代碼:  

Function BtoS (bstr)  
If not Is Null (bstr) Then  
for i = 0 to lenb(bstr) - 1  
bchr = midb(bstr,i+1,1)  
If ascb(bchr)>127 Then  ’漢字是雙字節(jié),得兩個(gè)字符一起處理  
temp = temp&chr(ascw(midb(bstr, i+2, 1)&bchr))  
i = i+1  
Else  
temp = temp&chr(ascb(bchr))  
End If  
next  
End If  
BtoS = temp  
End Function  

(2) 獲得文件(或文本框)內(nèi)容  

在實(shí)際的WEB應(yīng)用中,上傳操作可能涉及多項(xiàng)內(nèi)容,如多個(gè)文本框、多個(gè)文件等等。文件和文本框很好區(qū)分,文件的數(shù)據(jù)中包含了"filename="字串。因此,我們寫(xiě)了如下的通用函數(shù),既可用于提取文件內(nèi)容,又可提取文本框內(nèi)容(需進(jìn)行二進(jìn)制轉(zhuǎn)換):  

Function getdata(byval data, byval divider, final)  ’data表示二進(jìn)制串;divider表示分割符;final表示數(shù)據(jù)的結(jié)束位置  
filename=chrb(102)&chrb(105)&chrb(108)&chrb(101)&chrb(110)&chrb(97)&chrb(109)&chrb(101)&chrb(61)&chrb(34)  ’字符串filename="的二進(jìn)制表示  
bncrlf=chrb(13)&chrb(10)  ’二進(jìn)制的回車(chē)符  
startpos = instrb(data,divider)+lenb(divider)+lenb(bncrlf)  ’ 開(kāi)始位置  
endpos = instrb(startpos,data, divider)-lenb(bncrlf)  ’結(jié)束位置  
part1 = midb(data, startpos, endpos-startpos)  ’兩個(gè)分割符之間的內(nèi)容  
firstline = midb(part1, 1, instrb(part1, bncrlf)-1)  ’ 內(nèi)容之前的說(shuō)明段  
If (instrb(firstline,filename)=0) Then  ’若為文本框,獲得文本框字符串內(nèi)容  

stemp=midb(part1,instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf),lenb(part1)-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))  
getdata=BtoS(stemp)  
Else  ’若為文件,獲得文件二進(jìn)制內(nèi)容  
Getdata=midb (part1, instrb (part1, bncrlf&bncrlf)+lenb (bncrlf&bncrlf), lenb (part1)  
-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))  
End If  
Final=endpos  
End function  

在程序中直接調(diào)用該函數(shù)就可獲得所需文件(或文本框)內(nèi)容,如下所示:  

<%  
Content=getdata (data, divider, position)  
%>  

3) 獲得文件名稱(chēng)  
前面已經(jīng)分析過(guò)了,上傳文件數(shù)據(jù)流的"filename="字段里包含了文件的名稱(chēng)和絕對(duì)路 徑。一般來(lái)說(shuō),我們只需提取出路徑中的文件名即可,以下是程序代碼:  

<%  
namepos=instrrev(B2S(firstline),chr(92))  ’firstline即上面獲得的說(shuō)明部分?jǐn)?shù)據(jù),chr(92)  
表示"/"  
filename=midb(firstline,namepos+1,lenb(firstline)-namepos-1)  ’獲得文件名稱(chēng)  
%>  

利用ASP直接實(shí)現(xiàn)文件上傳功能  

傳統(tǒng)的ASP程序員只能利用FILESYSTEMOBJECT對(duì)象對(duì)文本文件(.txt)進(jìn)行移動(dòng)、復(fù)制、刪除等操作,若需處理二進(jìn)制對(duì)象,則不得不采用本文前面介紹的那些方法來(lái)實(shí)現(xiàn)。但是,現(xiàn)在ASP中的ADO.STREAM對(duì)象可以同時(shí)操作文本對(duì)象和二進(jìn)制對(duì)象(可以在http://www.microsoft.com/data下載),利用它就可以在ASP中直接實(shí)現(xiàn)文件上傳功能。下面,我們就介紹其實(shí)現(xiàn)過(guò)程。  

1)打開(kāi)STREAM對(duì)象  

對(duì)于SREAM對(duì)象而言,若要進(jìn)行文件的保存,則必須是將該對(duì)象的全部?jī)?nèi)容進(jìn)行保存。因此,我們必須要?jiǎng)?chuàng)建兩個(gè)(或多個(gè))STREAM對(duì)象,其中一個(gè)為源數(shù)據(jù)流,即接收初始的二進(jìn)制數(shù)據(jù);另一個(gè)為目的數(shù)據(jù)流,即接收來(lái)自經(jīng)源數(shù)據(jù)流處理后的數(shù)據(jù),并最終保存為所需的文件。  

<%  
set str=server.CreateObject("ADODB.Stream")  ’str為源數(shù)據(jù)流  
str.Mode=3  ’設(shè)置打開(kāi)模式,3為可讀可寫(xiě)  
str.Type=1  ’設(shè)置數(shù)據(jù)類(lèi)型,1為二進(jìn)制數(shù)據(jù)  
str.Open  
set desc=server.CreateObject("ADODB.Stream")  ’desc為目標(biāo)數(shù)據(jù)流  
desc.Mode=3  
Desc.Type=1  
desc.Open  
%>  

2)STEAM對(duì)象間內(nèi)容的復(fù)制  

在該部分,必須在源數(shù)據(jù)流中定位文件開(kāi)始的位置,并且求出文件內(nèi)容的長(zhǎng)度,才能將文件正確的復(fù)制到目的數(shù)據(jù)流中,并且保存文件,程序代碼如下:  

<%  
formdata=Request.BinaryRead(Request.TotalBytes)  ’formdata為上傳的所有內(nèi)容 

str.Write formdata  ’ 賦值源數(shù)據(jù)流  
str.position=count-lenb(result)-2  ’position指出文件的開(kāi)始位置  
str.copyto desc, lenb(filecotent)  ’lenb(filecontent)表示文件的長(zhǎng)度  
desc.SaveToFile fullpath,2  ’以fullpath指定的路徑及名稱(chēng)保存文件  
%>  

3)關(guān)閉STEAM對(duì)象  

編程完成后,應(yīng)關(guān)閉并釋放STEAM對(duì)象,如下所示:  

<%  
Desc. Close  
Set desc=nothing  
Str. Close  
Set STR=nothing  
%>  

總結(jié)  

本文給出了利用ASP直接實(shí)現(xiàn)文件上傳的方法,在本單位自行開(kāi)發(fā)的信息管理系統(tǒng)中得到了很好的應(yīng)用。實(shí)踐證明:與傳統(tǒng)的幾種文件上傳方法相比,該方法更簡(jiǎn)便、更高效。

發(fā)表評(píng)論 共有條評(píng)論
用戶(hù)名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 巴塘县| 赤峰市| 德化县| 临沂市| 浏阳市| 绵竹市| 兴安盟| 宜兴市| 顺昌县| 汝南县| 兴义市| 塘沽区| 舟曲县| 黄浦区| 大英县| 钦州市| 铁岭县| 溆浦县| 新郑市| 东方市| 拉萨市| 甘肃省| 秦安县| 凌海市| 鸡泽县| 凌源市| 清远市| 桂东县| 陆丰市| 修文县| 新宾| 淄博市| 旬邑县| 施秉县| 苏州市| 乐平市| 枣阳市| 二连浩特市| 尼玛县| 红河县| 泸州市|