用ASP和VBScript上載文件(二)
2024-05-04 11:06:34
供稿:網(wǎng)友
上載腳本的使用
下面是開發(fā)的上載腳本的應(yīng)用范例。本文的下載文件提供例子中的文件和代碼。將壓縮文件釋放到一個路徑下,為你的網(wǎng)絡(luò)服務(wù)器配置一個虛擬路徑。可以在瀏覽器中測試和啟動uploadform.html。
調(diào)用腳本
下面是調(diào)用上載builduploadrequest 方法的途徑。首先調(diào)用一個全程dictionary:uploadrequest。然后調(diào)用builuploadrequest方法,然后在自變量中傳送到請求原始二進(jìn)制數(shù)據(jù)。
bytecount = request.totalbytes
requestbin = request.binaryread(bytecount)
dim uploadrequest
set uploadrequest = createobject("scripting.dictionary")
builduploadrequest requestbin
數(shù)據(jù)被分解并存儲在dictionary對象中,并用item() 方法恢復(fù)。這些item 數(shù)據(jù)可以保存在vbscript 變量中,并且可以在代碼的任何地方使用。數(shù)據(jù)可以作為響應(yīng)傳送回客戶機(jī),或用在asp代碼中,或?qū)戇M(jìn)文件中及放入數(shù)據(jù)庫中。
取回數(shù)據(jù)
uploadrequest 對象的數(shù)據(jù)可用item("key") 函數(shù)進(jìn)行存取。現(xiàn)在來考慮一下這樣的情況:要存取一個 email控制的值。可以這樣做:
email = uploadrequest.item("email").item("value")
因為這是一個文本類控制,內(nèi)容是一個字符串,這個字符串可以同任何其它vbscript 字符串一樣使用。 對于二進(jìn)制數(shù)據(jù),可以用相同方法恢復(fù)內(nèi)容:
picture = uploadrequest.item("blob").item("value")
也可以存取其它信息,如文件名和content-type。他們是文本類控制。
contenttype = uploadrequest.item("blob").item("contenttype")
filepathname = uploadrequest.item("blob").item("filename")
在 vbscript 代碼中使用數(shù)據(jù)
上載的數(shù)據(jù)可以同其它變量一樣在vbscript 代碼中使用。比如說,它們可以作為響應(yīng)發(fā)送回客戶機(jī)。
your email is : 〈%=email%〉
file name of you picture is 〈%=filepathname%〉
file type of your picture is 〈%=contenttype%〉
二進(jìn)制數(shù)據(jù)也可以發(fā)送回客戶機(jī)。必須設(shè)置一個content-type,可以用binarywrite 方法寫二進(jìn)制數(shù)據(jù)。
response.contenttype = contenttype response.binarywrite picture
向文件中寫入上載數(shù)據(jù)
在文件類控制的情況下,目的通常是將二進(jìn)制數(shù)據(jù)存入某個文件或數(shù)據(jù)庫域,而不是將它們傳送回客戶機(jī)。這個目的是上載文件的固有特點。使用filesystem對象將上載文件存入服務(wù)器的文件系統(tǒng)中。
首先創(chuàng)建filesystem對象:
’create filesytemobject component set scriptobject = server.createobject("scripting.filesystemobject")
用filesystem對象在路徑中創(chuàng)建一個文件。路徑可以是絕對的,直接指向文件系統(tǒng)(如c:/temp)。也可以是相對的,到網(wǎng)絡(luò)服務(wù)器定義的一個虛擬路徑下。用mappath方法和path_info服務(wù)器變量將虛擬路徑影射到絕對路徑。
write方法需要一個雙字節(jié)字符串作為自變量,所以要將單字節(jié)數(shù)列轉(zhuǎn)換成字符串。write方法負(fù)責(zé)轉(zhuǎn)換這個雙字節(jié)字符串,并用ascii 格式寫它。這就建立了一個包含我們原始的單字節(jié)字符串的二進(jìn)制內(nèi)容的文件。我已將這個文件命名為“uploaded+filename”,這只是為了區(qū)別文件,你可以使用任何其它文件名,如:
’create and write to a file set myfile = scriptobject.createtextfile(server.mappath(request.servervariables _ ("path_info")) & "uploaded" & filename)
for i = 1 to lenb(value)
myfile.write chr(ascb(midb(value, i, 1)))
next
myfile.close
將上載數(shù)據(jù)存入數(shù)據(jù)庫
數(shù)據(jù)還可以被存入數(shù)據(jù)庫。content-type 也應(yīng)該存入數(shù)據(jù)庫中,以便以后顯示數(shù)據(jù)。首先要建立與數(shù)據(jù)庫的連接,假定已經(jīng)設(shè)置了適當(dāng)?shù)膁sn:
set conn = server.createobject("adodb.connection")
conn.open "dsn=wroxdns","user","pass"
然后從連接中創(chuàng)建記錄集:
sql = "select photo, contenttype from mytable"
set rs = server.createobject("adodb.recordset")
rs.open sql, conn, 3, 3
記錄集創(chuàng)建之后,要將二進(jìn)制數(shù)據(jù)放入數(shù)據(jù)庫的blob域中:
picturechunk = picture & chrb(0)
rs.fields("picture").appendchunk picturechunk
rs.fields("contenttype") = contenttype
rs.update
conn.close
在appendchunk 方法中,我不得不解決一個臭蟲。事實上我注意到,當(dāng)二進(jìn)制數(shù)據(jù)有奇數(shù)字節(jié)時,appendchunk 方法就不傳送最后一個字節(jié)。解決的辦法是增加一個chr(0),以確保傳送了所有的字節(jié)。也許還有其它辦法,如果有的話,請告訴我。
要得到數(shù)據(jù)庫的映象,使用相同的記錄集,并用正確的內(nèi)容類型將它作為響應(yīng)發(fā)送回客戶機(jī)。
response.contenttype = rs.fields("contenttype")
size = rs.fields("picture").actualsize
blob = rs.fields("picture").getchunk(size)
response.binarywrite blob
結(jié)論
本文展現(xiàn)了一個完整的用vbscript 進(jìn)行文件上載的方法。編碼完全是vbscript ,獨立于第三方產(chǎn)品。
首先集中介紹上載的過程(用" multipart/form-data "型內(nèi)容進(jìn)行html傳遞)。然后詳細(xì)介紹上載的 vbscript代碼。開始時對操作字符串和單字節(jié)數(shù)列的vbscript函數(shù)進(jìn)行簡要回顧。然后介紹了腳本的代碼 以及上載數(shù)據(jù)的結(jié)構(gòu)。
最后顯示了這個腳本的多個用途,從使用asp代碼中的上載變量到數(shù)據(jù)庫或文件系統(tǒng)中存儲上載文件。
點擊下面的鏈接,下載<a >本文的例程代碼。 本文來源于網(wǎng)頁設(shè)計愛好者web開發(fā)社區(qū)http://www.html.org.cn收集整理,歡迎訪問。