vbscript|vbscript 上傳指令碼的使用
下面是開發的上傳指令碼的應用範例。本文的下載檔案提供例子中的檔案和代碼。將壓縮檔釋放到一個路徑下,為你的網路伺服器配置一個虛擬路徑。可以在瀏覽器中測試和啟動uploadForm.html。
呼叫指令碼
下面是調用上傳BuildUploadRequest 方法的途徑。首先調用一個全程dictionary:UploadRequest。然後調用BuilUploadRequest方法,然後在自變數中傳送到請求原始位元據。
byteCount = Request.TotalBytes
RequestBin = Request.BinaryRead(byteCount)
Dim UploadRequest
Set UploadRequest = CreateObject("Scripting.Dictionary")
BuildUploadRequest RequestBin
資料被分解並儲存在dictionary對象中,並用Item() 方法恢複。這些item 資料可以儲存在VBScript 變數中,並且可以在代碼的任何地方使用。資料可以作為響應傳送回客戶機,或用在ASP代碼中,或寫進檔案中及放入資料庫中。
取回資料
UploadRequest 對象的資料可用Item("key") 函數進行存取。現在來考慮一下這樣的情況:要存取一個 email控制的值。可以這樣做:
email = UploadRequest.Item("email").Item("Value")
因為這是一個文本類控制,內容是一個字串,這個字串可以同任何其它VBScript 字串一樣使用。 對於位元據,可以用相同方法恢複內容:
picture = UploadRequest.Item("blob").Item("Value")
也可以存取其它資訊,如檔案名稱和content-type。他們是文本類控制。
contentType = UploadRequest.Item("blob").Item("ContentType")
filepathname = UploadRequest.Item("blob").Item("FileName")
在 VBScript 代碼中使用資料
上傳的資料可以同其它變數一樣在VBScript 代碼中使用。比如說,它們可以作為響應發送回客戶機。
Your email is : 〈%=email%〉
File name of you picture is 〈%=filepathname%〉
File type of your picture is 〈%=contentType%〉
位元據也可以發送回客戶機。必須設定一個content-type,可以用BinaryWrite 方法寫位元據。
Response.ContentType = contentType Response.BinaryWrite picture
向檔案中寫入上傳資料
在檔案類控制的情況下,目的通常是將位元據存入某個檔案或資料庫域,而不是將它們傳送回客戶機。這個目的是上傳檔案的固有特點。使用FileSystem對象將上傳檔案存入伺服器的檔案系統中。
首先建立FileSystem對象:
’Create FileSytemObject Component Set ScriptObject = Server.CreateObject("Scripting.FileSystemObject")
用FileSystem對象在路徑中建立一個檔案。路徑可以是絕對的,直接指向檔案系統(如c:\temp)。也可以是相對的,到網路伺服器定義的一個虛擬路徑下。用mappath方法和PATH_INFO伺服器變數將虛擬路徑影射到絕對路徑。
Write方法需要一個雙位元組字元串作為自變數,所以要將單位元組數列轉換成字串。Write方法負責轉換這個雙位元組字元串,並用ASCII 格式寫它。這就建立了一個包含我們原始的單位元組字串的二進位內容的檔案。我已將這個檔案命名為“uploaded+filename”,這隻是為了區別檔案,你可以使用任何其它檔案名稱,如:
’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
將上傳資料存入資料庫
資料還可以被存入資料庫。content-type 也應該存入資料庫中,以便以後顯示資料。首先要建立與資料庫的串連,假定已經設定了適當的DSN:
Set conn = Server.CreateObject("ADODB.Connection")
conn.open "DSN=wroxdns","user","pass"
然後從串連中建立記錄集:
sql = "SELECT PHOTO, CONTENTTYPE FROM MYTABLE"
Set rs = Server.CreateObject("ADODB.Recordset")
rs.Open sql, conn, 3, 3
記錄集建立之後,要將位元據放入資料庫的blob域中:
picturechunk = picture & chrB(0)
rs.Fields("PICTURE").appendChunk picturechunk
rs.Fields("CONTENTTYPE") = contentType
rs.Update
conn.close
在appendChunk 方法中,我不得不解決一個臭蟲。事實上我注意到,當位元據有奇數位元組時,appendChunk 方法就不傳送最後一個位元組。解決的辦法是增加一個chr(0),以確保傳送了所有的位元組。也許還有其它辦法,如果有的話,請告訴我。
要得到資料庫的映象,使用相同的記錄集,並用正確的內容類型將它作為響應發送回客戶機。
Response.contentType = rs.Fields("CONTENTTYPE")
size = rs.Fields("PICTURE").ActualSize
blob = rs.Fields("PICTURE").GetChunk(size)
Response.binarywrite blob
結論
本文展現了一個完整的用VBScript 進行檔案上傳的方法。編碼完全是VBScript ,獨立於第三方產品。
首先集中介紹上傳的過程(用" multipart/form-data "型內容進行HTML傳遞)。然後詳細介紹上傳的 VBScript代碼。開始時對操作字串和單位元組數列的VBScript函數進行簡要回顧。然後介紹了指令碼的代碼 以及上傳資料的結構。
最後顯示了這個指令碼的多個用途,從使用ASP代碼中的上傳變數到資料庫或檔案系統中儲存上傳檔案。
點擊下面的連結,下載<a href="http://www.asptoday.com/articles/images/20000316.zip">本文的常式代碼。