利用ASP技術(shù)實現(xiàn)文件直接上傳功能_第1頁
利用ASP技術(shù)實現(xiàn)文件直接上傳功能_第2頁
利用ASP技術(shù)實現(xiàn)文件直接上傳功能_第3頁
利用ASP技術(shù)實現(xiàn)文件直接上傳功能_第4頁
利用ASP技術(shù)實現(xiàn)文件直接上傳功能_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、利用ASP技術(shù)實現(xiàn)文件直接上傳功能摘要: 本文首先比較了幾種常見的文件上傳技術(shù),然后通過實例介紹了利用ASP技術(shù)直接實現(xiàn)文件上傳的具體方法。關(guān)鍵詞:ASP;文件上傳;二進制數(shù)據(jù)引言采用WEB技術(shù)實現(xiàn)B/S(瀏覽器/服務(wù)器)結(jié)構(gòu)的管理系統(tǒng)是辦公自動化的發(fā)展趨勢?;赪EB技術(shù)的管理系統(tǒng),由于開發(fā)周期短;與用戶平臺無關(guān);易于實現(xiàn)交互式應(yīng)用;能對信息進行快速、高效的收集、處理和發(fā)布,近幾年來得到了迅速發(fā)展。而ASP技術(shù)由于其開發(fā)效率高、交互性好,安全性強等特點,逐漸成為開發(fā)管理系統(tǒng)的首選工具。許多基于WEB的應(yīng)用都涉及文件上傳操作。常見的文件上傳技術(shù)有:基于HTTP協(xié)議的;基于VB(或DELPHI等

2、編程語言)開發(fā)的文件上傳組件的;基于數(shù)據(jù)庫技術(shù)的等等。這些方法一般都需要編程者能同時掌握WEB技術(shù)、數(shù)據(jù)庫技術(shù)或CGI技術(shù)或組件技術(shù),對編程者的要求較高。而本文將介紹的利用ASP技術(shù)直接實現(xiàn)文件上傳功能則只需編程者掌握單一的ASP技術(shù)即可,大大降低了編程難度。幾種文件上傳技術(shù)的比較1、基于HTTP協(xié)議該方法需要編程者利用第三方軟件,如DELPHI、VB等,在應(yīng)用程序中先進行HTTP協(xié)議編程,然后將待上傳文件內(nèi)容按HTTP協(xié)議的格式打包,最后向WEB服務(wù)器發(fā)送上傳的請求報文,從而實現(xiàn)文件的上傳。因為DELPHI和VB不能編寫完整的WEB網(wǎng)絡(luò)程序,只能編寫WEB小應(yīng)用程序,因此,該方法只用于功能受

3、限的網(wǎng)絡(luò)應(yīng)用。2、基于VB(或DELPHI等)開發(fā)的文件上傳組件該方法利用VB(或DELPHI等編程語言)開發(fā)ASP服務(wù)器組件,實現(xiàn)特定的文件上傳服務(wù)。它首先利用ASP表單功能將文件(二進制格式)從用戶端上傳到服務(wù)器端,然后使用VB開發(fā)的組件,對二進制文件進行處理,成為可以正常讀寫的文件。該方法要求編程者不僅掌握ASP語言,而且還能利用VB等第三方語言進行組件編程,增加了開發(fā)的難度。3、基于數(shù)據(jù)庫技術(shù)該方法和上個方法有類似之處。不同的地方在于對上傳的二進制文件的處理上。它使用數(shù)據(jù)庫來保存二進制文件。無論是小型數(shù)據(jù)庫還是大型數(shù)據(jù)庫都提供了存儲二進制數(shù)據(jù)的數(shù)據(jù)類型,只要以Append Chunk方

4、式將數(shù)據(jù)存入相應(yīng)的字段就可以了。該方法雖然簡單可行,但是因為每次上傳的文件大小都是不一樣的,因此,會對數(shù)據(jù)庫的空間造成很大的浪費,降低了數(shù)據(jù)的訪問速度;并且使得文件只能在數(shù)據(jù)庫環(huán)境下進行訪問,造成了很大的不便。實例分析但是,利用ASP技術(shù)直接實現(xiàn)文件上傳功能則只需編程者掌握單一的ASP技術(shù)即可,大大降低了編程難度。下面我們將通過一個實例來介紹如何使用該方法。1、文件上傳表單首先需要編寫一個能提供文件上傳功能的表單,程序如下所示:Form action="upload.asp" method=post enctype="multipart/form-data&quo

5、t;上傳文件:Input type=file name=file1brinput type=submit name=upload value="上傳"/form其中,enctype參數(shù)用來設(shè)置表單的MIME編碼方式,在進行文件(或同時包含文本框)上傳時,必須將其屬性設(shè)置為"multipart/form-data";upload.asp是服務(wù)器端對接收到的二進制文件流進行處理的ASP程序,在本文的后面將陸續(xù)介紹其內(nèi)容。2、上傳文件格式分析在處理文件之前,我們要先了解上傳的文件的具體格式,通過編寫下面一段簡單的ASP程序就可以查看其二進制代碼:%filesi

6、ze=Request.TotalBytes '獲得上傳文件的大小filedata=Request.BinaryRead(filesize) '獲得上傳文件的二進制數(shù)據(jù)Response.BinaryWrite filedata '在瀏覽器上顯示二進制數(shù)據(jù)%分析瀏覽器上顯示的上傳文件的二進制代碼,發(fā)現(xiàn)代碼包括四個部分(若同時上傳多個文件或文本框,則代碼按上傳的先后次序排列,格式相同),每一部分的內(nèi)容是用回車換行符號來進行分隔的:1)第一部分(起始標志)-7d329631b04d4 2)第二部分(文件說明)Content-Disposition: form-data; nam

7、e="file1" filename="C:Documents and SettingsAdministratorMy DocumentsInvitation.doc" Content-Type: application/msword在此,我們可以獲得上傳文件的文件名稱及絕對路徑,也可以獲得文件類型。這些信息是正確保存文件所不可缺少的。 3)第三部分(文件內(nèi)容)即文件的二進制內(nèi)容,略。4)第四部分(結(jié)束標志)-7d329631b04d4結(jié)合第一部分和第四部分的內(nèi)容來看,"-7d329631b04d4"(每次上傳,數(shù)值都不一樣)起到了分

8、割符的作用,它標志著一段數(shù)據(jù)(當有多個上傳內(nèi)容時)的開始和結(jié)束。從保存文件所需要的信息來講,我們首先需要從第二部分數(shù)據(jù)的"filename"中獲得文件名稱,然后需要正確定位文件的起始位置,最后利用ASP技術(shù)將二進制文件用本來的文件名保存即可。若同時上傳多個內(nèi)容(如多個文本框和文件),也是按同樣的方法處理,每部分的內(nèi)容都包含在分割符之中,只是文本框和文件的表現(xiàn)形式稍有不同,這可以通過具體分析其二進制代碼來了解。3、利用ASP技術(shù)實現(xiàn)文件存儲上傳文件代碼的處理1) 獲得分割符代碼從上面的分析我們已經(jīng)知道,分割符起到了分割多個數(shù)據(jù)段(包括文本框和各種類型的文件)的重要作用。前面已

9、經(jīng)分析過,分割符出現(xiàn)在第一個回車換行符號前。因此,通過下面這段程序就可獲得分割符代碼: %newline=chrB(13) & chrB(10) 'newline表示二進制的回車符filesize=Request.TotalBytes 'filesize是上傳文件的大小filedata=Request.BinaryRead(filesize) 'filedata是上傳文件的二進制數(shù)據(jù)divider=leftB(filedata,clng(instrb(filedata,newline)-1) 'divider是分割符%注:因為這里處理的都是二進制字節(jié)碼,

10、因此,所有的函數(shù)都是使用它的二進制版本,加了"b "。2) 獲得文件(或文本框)內(nèi)容(1) 預備函數(shù)(將二進制串轉(zhuǎn)化成字符串)上傳文件的內(nèi)容不需要經(jīng)過二進制向字符串的轉(zhuǎn)換過程,直接保存就可。但是,若需提取文本框內(nèi)容或文件的名稱,就必須進行轉(zhuǎn)換。因此,需要編寫一個通用的,并且適用于漢字的轉(zhuǎn)換函數(shù)。以下是該函數(shù)代碼:Function BtoS (bstr) If not Is Null (bstr) Thenfor i = 0 to lenb(bstr) - 1 bchr = midb(bstr,i+1,1)If ascb(bchr)127 Then '漢字是雙字節(jié),得

11、兩個字符一起處理 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)容在實際的WEB應(yīng)用中,上傳操作可能涉及多項內(nèi)容,如多個文本框、多個文件等等。文件和文本框很好區(qū)分,文件的數(shù)據(jù)中包含了"filename="字串。因此,我們寫了如下的通用函數(shù),既可用于提取文件內(nèi)容,又可提取文本框內(nèi)容(需進行二進制轉(zhuǎn)換):Funct

12、ion getdata(byval data, byval divider, final) 'data表示二進制串;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"的二進制表示 bncrlf=chrb(13)&chrb(10) '

13、二進制的回車符startpos = instrb(data,divider)+lenb(divider)+lenb(bncrlf) ' 開始位置endpos = instrb(startpos,data, divider)-lenb(bncrlf) '結(jié)束位置part1 = midb(data, startpos, endpos-startpos) '兩個分割符之間的內(nèi)容firstline = midb(part1, 1, instrb(part1, bncrlf)-1) ' 內(nèi)容之前的說明段If (instrb(firstline,filename)=0) T

14、hen '若為文本框,獲得文本框字符串內(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 '若為文件,獲得文件二進制內(nèi)容Getdata=midb (part1, instrb (part1, bncrlf&bncrlf)+lenb (bncrlf&bncrlf), lenb (par

15、t1)-instrb(part1,bncrlf&bncrlf)+lenb(bncrlf&bncrlf) End If Final=endpos End function在程序中直接調(diào)用該函數(shù)就可獲得所需文件(或文本框)內(nèi)容,如下所示:%Content=getdata (data, divider, position) %3) 獲得文件名稱前面已經(jīng)分析過了,上傳文件數(shù)據(jù)流的"filename="字段里包含了文件的名稱和絕對路 徑。一般來說,我們只需提取出路徑中的文件名即可,以下是程序代碼:%namepos=instrrev(B2S(firstline),chr

16、(92) 'firstline即上面獲得的說明部分數(shù)據(jù),chr(92)表示"/"filename=midb(firstline,namepos+1,lenb(firstline)-namepos-1) '獲得文件名稱%利用ASP直接實現(xiàn)文件上傳功能傳統(tǒng)的ASP程序員只能利用FILESYSTEMOBJECT對象對文本文件(.txt)進行移動、復制、刪除等操作,若需處理二進制對象,則不得不采用本文前面介紹的那些方法來實現(xiàn)。但是,現(xiàn)在ASP中的ADO.STREAM對象可以同時操作文本對象和二進制對象(可以在1)打開STREAM對象對于SREAM對象而言,若要進行文

17、件的保存,則必須是將該對象的全部內(nèi)容進行保存。因此,我們必須要創(chuàng)建兩個(或多個)STREAM對象,其中一個為源數(shù)據(jù)流,即接收初始的二進制數(shù)據(jù);另一個為目的數(shù)據(jù)流,即接收來自經(jīng)源數(shù)據(jù)流處理后的數(shù)據(jù),并最終保存為所需的文件。 %set str=server.CreateObject("ADODB.Stream") 'str為源數(shù)據(jù)流str.Mode=3 '設(shè)置打開模式,3為可讀可寫str.Type=1 '設(shè)置數(shù)據(jù)類型,1為二進制數(shù)據(jù)str.Open set desc=server.CreateObject("ADODB.Stream") 'desc為目標數(shù)據(jù)流desc.Mode=3 Desc.Type=1 desc.Open%2)STEAM對象間內(nèi)容的復制在該部分,必須在源數(shù)據(jù)流中定位文件開始的位置,并且求出文件內(nèi)容的長度,才能將文件正確的復制到目的數(shù)據(jù)流中,并且保存文件,程序代碼如下:%formdata=Request.BinaryRead(Request.TotalBytes) 'formdata為上傳的所有內(nèi)容 str.Write formdata ' 賦值源數(shù)據(jù)流str.position=count-lenb(result)-2 'position指出文件的開始位置str.c

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論