亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > ASP > 正文

二進制上傳文件的實現方法及代碼

2024-05-04 11:07:28
字體:
來源:轉載
供稿:網友

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

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

2、上傳文件格式分析  

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

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

分析瀏覽器上顯示的上傳文件的二進制代碼,發現代碼包括四個部分(若同時上傳多個文件或文本框,則代碼按上傳的先后次序排列,格式相同),每一部分的內容是用回車換行符號來進行分隔的:  

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

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


在此,我們可以獲得上傳文件的文件名稱及絕對路徑,也可以獲得文件類型。這些信息是正確保存文件所不可缺少的。  

3)第三部分(文件內容)  

即文件的二進制內容,略。  

4)第四部分(結束標志)  

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

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

3、利用ASP技術實現文件存儲  

上傳文件代碼的處理  

1) 獲得分割符代碼  

從上面的分析我們已經知道,分割符起到了分割多個數據段(包括文本框和各種類型的文件)的重要作用。前面已經分析過,分割符出現在第一個回車換行符號前。因此,通過下面這段程序就可獲得分割符代碼:  

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

注:因為這里處理的都是二進制字節碼,因此,所有的函數都是使用它的二進制版本,加了"b "。  

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

(1) 預備函數(將二進制串轉化成字符串)  

上傳文件的內容不需要經過二進制向字符串的轉換過程,直接保存就可。但是,若需提取文本框內容或文件的名稱,就必須進行轉換。因此,需要編寫一個通用的,并且適用于漢字的轉換函數。以下是該函數代碼:  

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  ’漢字是雙字節,得兩個字符一起處理  
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) 獲得文件(或文本框)內容  

在實際的WEB應用中,上傳操作可能涉及多項內容,如多個文本框、多個文件等等。文件和文本框很好區分,文件的數據中包含了"filename="字串。因此,我們寫了如下的通用函數,既可用于提取文件內容,又可提取文本框內容(需進行二進制轉換):  

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

stemp=midb(part1,instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf),lenb(part1)-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf))  
getdata=BtoS(stemp)  
Else  ’若為文件,獲得文件二進制內容  
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  

在程序中直接調用該函數就可獲得所需文件(或文本框)內容,如下所示:  

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

3) 獲得文件名稱  
前面已經分析過了,上傳文件數據流的"filename="字段里包含了文件的名稱和絕對路 徑。一般來說,我們只需提取出路徑中的文件名即可,以下是程序代碼:  

<%  
namepos=instrrev(B2S(firstline),chr(92))  ’firstline即上面獲得的說明部分數據,chr(92)  
表示"/"  
filename=midb(firstline,namepos+1,lenb(firstline)-namepos-1)  ’獲得文件名稱  
%>  

利用ASP直接實現文件上傳功能  

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

1)打開STREAM對象  

對于SREAM對象而言,若要進行文件的保存,則必須是將該對象的全部內容進行保存。因此,我們必須要創建兩個(或多個)STREAM對象,其中一個為源數據流,即接收初始的二進制數據;另一個為目的數據流,即接收來自經源數據流處理后的數據,并最終保存為所需的文件。  

<%  
set str=server.CreateObject("ADODB.Stream")  ’str為源數據流  
str.Mode=3  ’設置打開模式,3為可讀可寫  
str.Type=1  ’設置數據類型,1為二進制數據  
str.Open  
set desc=server.CreateObject("ADODB.Stream")  ’desc為目標數據流  
desc.Mode=3  
Desc.Type=1  
desc.Open  
%>  

2)STEAM對象間內容的復制  

在該部分,必須在源數據流中定位文件開始的位置,并且求出文件內容的長度,才能將文件正確的復制到目的數據流中,并且保存文件,程序代碼如下:  

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

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

3)關閉STEAM對象  

編程完成后,應關閉并釋放STEAM對象,如下所示:  

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

總結  

本文給出了利用ASP直接實現文件上傳的方法,在本單位自行開發的信息管理系統中得到了很好的應用。實踐證明:與傳統的幾種文件上傳方法相比,該方法更簡便、更高效。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩美女在线看| 中文字幕日韩精品有码视频| 久久香蕉频线观| 亚洲精品福利免费在线观看| 久久久久九九九九| 中文字幕日本欧美| 亚洲最大av网站| 91精品在线观| 欧美国产日本在线| 国产精品免费小视频| 国精产品一区一区三区有限在线| 欧美做受高潮1| 啊v视频在线一区二区三区| 欧美一级在线播放| 国产精品久久在线观看| 久久影视电视剧凤归四时歌| 欧美日韩中文字幕综合视频| 国产精品网红直播| 亚洲国产日韩欧美在线99| 欧美超级免费视 在线| 欧美日韩在线视频首页| 精品视频偷偷看在线观看| 欧美激情精品久久久久久蜜臀| 欧美国产日本在线| 亚洲男人av电影| 亚洲欧美另类国产| 日韩av免费观影| 久久久久久噜噜噜久久久精品| 欧美激情一区二区三级高清视频| 亚洲精品短视频| 欧美日韩亚洲精品一区二区三区| 国产精品久久久久久av| 亚洲成人黄色在线| 国产日韩av在线播放| 美日韩精品视频免费看| 亚洲国产精久久久久久久| 丝袜美腿精品国产二区| 国产精品一二三在线| 亚洲一区二区免费在线| 亚洲福利视频专区| 国产一区私人高清影院| 国产一区二区丝袜高跟鞋图片| 欧美大尺度激情区在线播放| 国产成人精品日本亚洲专区61| 亚洲精品视频二区| 国产精品∨欧美精品v日韩精品| 色综合五月天导航| 韩日精品中文字幕| 欧美日韩国产在线看| 亚洲性无码av在线| 久久香蕉精品香蕉| 91精品国产成人www| 北条麻妃99精品青青久久| 日韩精品极品在线观看| 国产精品高潮在线| 91热精品视频| 国产精品18久久久久久麻辣| 97在线观看视频国产| 亚洲精品网站在线播放gif| www.亚洲一二| 国产精品黄色影片导航在线观看| 日韩欧美在线观看| 国产精品69av| 精品国偷自产在线视频99| 国产成人中文字幕| 亚洲a在线播放| 日韩视频在线免费| 日韩经典中文字幕在线观看| 精品久久久久久中文字幕大豆网| 国产精品99久久久久久人| 欧美夫妻性生活视频| 51色欧美片视频在线观看| 欧美猛交免费看| 在线精品视频视频中文字幕| 欧美日韩美女在线| 在线观看欧美日韩国产| 亚洲午夜久久久久久久| 91精品国产高清久久久久久久久| 九九久久国产精品| 亚洲欧美国产日韩中文字幕| 亚洲国产97在线精品一区| 亚洲国产女人aaa毛片在线| 国产剧情久久久久久| 黑人巨大精品欧美一区二区免费| 亚洲精品丝袜日韩| 久久久久久12| 亚洲色图综合网| 欧美乱人伦中文字幕在线| 午夜免费在线观看精品视频| 中文日韩在线视频| 国产精品青草久久久久福利99| 国产99久久精品一区二区| 日韩欧美极品在线观看| 国产欧美一区二区白浆黑人| 亚洲最新视频在线| 国产一区二区久久精品| 亚洲国产精品女人久久久| 亚洲人成网在线播放| 18性欧美xxxⅹ性满足| 国产精品偷伦视频免费观看国产| 精品激情国产视频| 日本精品久久中文字幕佐佐木| 欧美在线视频一区二区| 欧美另类老女人| 日韩高清免费观看| 国产精品成人v| 国产专区欧美专区| 成人日韩av在线| 久久夜精品va视频免费观看| 欧美黑人巨大精品一区二区| 亚洲片国产一区一级在线观看| 欧美性20hd另类| 宅男66日本亚洲欧美视频| 国产91精品高潮白浆喷水| 亚洲美女免费精品视频在线观看| 亚洲成人av在线播放| 38少妇精品导航| 国产成人涩涩涩视频在线观看| 91天堂在线视频| 羞羞色国产精品| 国产精品情侣自拍| 亚洲а∨天堂久久精品喷水| 最近2019好看的中文字幕免费| 中文字幕9999| 欧美资源在线观看| 中文字幕免费国产精品| 九九九久久久久久| 在线看福利67194| 亚洲精品久久久一区二区三区| xxx一区二区| 精品欧美激情精品一区| 久久久久久久影院| 亚洲久久久久久久久久| 亚洲自拍高清视频网站| 亚洲高清在线观看| 成人激情视频免费在线| 欧美精品18videos性欧| 亚洲欧洲在线看| 国产免费一区二区三区在线能观看| 91精品国产91久久久久久不卡| 国产精品视频xxx| 国产日韩精品电影| 午夜精品蜜臀一区二区三区免费| 日韩在线观看网址| 日韩av免费一区| 亚洲国产小视频在线观看| 国产成人一区二区三区电影| 久久久久久欧美| 亚洲国产中文字幕久久网| 久久久在线视频| 欧美疯狂性受xxxxx另类| 日韩av一区二区在线| 亚洲欧美国产日韩中文字幕| 久久精品国产一区二区电影| 亚洲国产小视频| 亚洲最新av在线| 欧美xxxwww| 亚洲欧美在线一区二区| 久久综合九色九九| 亚洲欧美一区二区精品久久久| 亚洲国产欧美精品| 国产婷婷成人久久av免费高清| 国产精品日韩av| 亚洲高清免费观看高清完整版|