摘要:在基于瀏覽器/服務器的應用環(huán)境中,,在瀏覽器中上傳各種類型的文件一直是困擾用戶文件管理應用的難題之一,。在HTTP中上傳文件有三種機制:RFC1867,,PUT和WebDAV,。常用的實現(xiàn)方法是利用在RFC1867中引入的一個新類型:File以及ADO Stream對象,。本文對上述上傳方法及實現(xiàn)原理作了論述,,并給出了具體解決實例。 關鍵詞:ASP 組件 FILE對象 當前,,基于瀏覽器/服務器模式的應用比較流行,。當用戶需要將文件傳輸?shù)椒掌魃蠒r,常用方法之一是運行FTP服務器并將每個用戶的FTP默認目錄設為用戶的Web主目錄,,這樣用戶就能運行FTP客戶程序并上傳文件到指定的 Web目錄,。這就要求用戶必須懂得如何使用FTP客戶程序。因此,,這種解決方案僅對熟悉FTP且富有經(jīng)驗的用戶來說是可行的,。 如果我們能把文件上傳功能與Web集成,使用戶僅用Web瀏覽器就能完成上傳任務,,這對于他們來說將是非常方便的,。但是,一直以來,由于File System Object的僅能傳送文本文件的局限,,所以ASP最大的難題就是文件上傳問題,。下面介紹的就是如何在基于HTTP協(xié)議的網(wǎng)頁中實現(xiàn)文件的上傳。 一.通過HTTP上傳的三種機制 通過HTTP上傳有三種機制:RFC1867, PUT 和 WebDAV,。 PUT 是在HTTP 1.1引入了一個新的HTTP動詞,。當web服務器收到一個HTTP PUT和對象名字,它將會驗證用戶,,接收HTTP流的內(nèi)容,,并把它直接存入web服務器。由于這可能會對一個web站點造成破壞,并且還會失去HTTP最大的優(yōu)勢:服務器可編程性,。在PUT的情況下,,服務器自己處理請求:沒有空間讓CGI或者ASP應用程序介入。唯一讓你的應用程序捕獲PUT的方法是在低層操作,,ISAPI過濾層,。由于相應的原因,PUT的應用很有限,。 而WebDAV允許web內(nèi)容的分布式認證與翻譯,。它引入了幾種新的HTTP動詞,允許通過HTTP上傳,,鎖定/解鎖,,登記/檢驗web內(nèi)容。Office 2000中的"Save to web" 就是通過WebDAV來實現(xiàn)的,。如果你所感興趣的一切都是上傳內(nèi)容,,WebDAV應用得非常出色,它解決了很多問題,。 然而,,如果你需要在你的web應用程序里面上傳文件,WebDAV對你就毫無用處可言,。象HTTP PUT一樣,,那些WebDAV的動詞是被服務器解釋的,而不是web應用程序,。你需要工作在ISAPI過濾層來訪問WebDAV的這些動詞,,并在你的應用程序中解釋內(nèi)容。 RFC1867 (http://www./rfc/rfc1867.txt) 最終被W3C在HTML3.2中接受前,,是作為一種建議標準,。它是一種非常簡單但是功能很強大的想法:在表單字段中定義一個新類型。 <INPUT TYPE="FILE"> 并且在表單本身加入了不同的編碼方案,,不再使用典型的: <FORM ACTION="formproc.asp" METHOD="POST"> 而是使用: <FORM ACTION="formproc.asp" METHOD="POST" ENCTYPE="multipart/form-data"> 這種編碼方案在傳送大量數(shù)據(jù)的時候,,比起缺省的"application/x-url-encoded"表單編碼方案,顯得效率要高得多,。URL編碼只有很有限的字符集,,使用任何超出字符集的字符,必須用 %nn 代替,,這里的nn表示相應的2個十六進制數(shù)字,。例如,即使是普通的空格字符也要用 %20 代替,。而RFC1867使用多部分MIME編碼,,就象通常在e-mail消息中看到的那樣,,不編碼來傳送大量數(shù)據(jù),而只是在數(shù)據(jù)周圍加上很少的簡單但實用的頭部,。主要瀏覽器的廠商都采用了建議的"瀏覽..."按鈕,,用戶能很容易的使用本地"打開文件..." 對話框選擇要上傳的文件。 RFC1867仍然將大多數(shù)文件上傳的靈活方法留給了你的web應用程序,。PUT用得很有限,。WebDAV對內(nèi)容的作者很有用,比如FrontPage用戶,,但是對想在web應用程序中加入文件上傳的web開發(fā)者來說很少用到,。因此,RFC1867是在web應用程序中加入文件上傳的最好的辦法,。 在實際應用中,,微軟免費提供了Posting Acceptor ,。ASP不懂"multipart/form-data" 編碼方案,。取而代之,微軟提供了Posting Acceptor ,,Posting Acceptor是一種在上傳完成后,,接受REPOST到一個ASP頁的ISAPI應用程序。 Software Artisans的SA-FileUp是最早的商業(yè)Active Server組件之一,。幾經(jīng)改進,,現(xiàn)在作為一個純粹的ASP組件存在。 二.基于ASP的文件上傳實現(xiàn)原理分析 基本原理是:采用ADO Stream對象的BinaryRead方法將FORM中的所有數(shù)據(jù)讀出,,從中截取出所需的文件數(shù)據(jù),,以二進制文件方式存盤。 下面是上傳文件頁面的一個例子(upload.htm): <html> <body> <form name="Upload" Method="Post" Enctype="multipart/form-data" Action="Upload.asp"> <input type="file" name="FileName"> <INPUT TYPE="Submit" VALUE="Upload"></TD> </form> </body> </html> 程序中使用了文件對象,,這樣在Upload.asp中采用BinaryRead方法讀來的原始數(shù)據(jù)就不僅僅是選擇的文件本身的數(shù)據(jù),,還包含該文件在用戶硬盤上的路徑、類型,、提交頁面的表單域名等相關信息的描述,,這樣我們就需從中提取出文件的具體內(nèi)容。根據(jù)分析,,數(shù)據(jù)的頭部信息與數(shù)據(jù)的分界線是兩對回車換行符,,尾部也有分隔信息,我們可以采用類似以下的方法獲取文件數(shù)據(jù),。 Dim FormData.FormSize,DataStart,CLStr,,DivStr FormSize=Request.TotalBytes FormData=Request.BinaryRead(FormSize) CLStr=ChrB(13)&ChrB(10) DataStart=InStrB(FormData.CLStr&CLStr)+4 4是兩對回車換行符的長度 DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1) DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2 FormData=MidB(FormData,DataStart,DataSize) FormData就是文件的內(nèi)容了。 中間根據(jù)需要,,可進行相應的處理,。最后的工作就是將文件保存了。保存的方法可以有兩種:一種是利用VB或VC之類程序中的二進制文件操作方法,在工程中加入適當?shù)念愋蛶?,最終編譯成DLL文件,,使用時再將該DLL文件注冊就可以了。文件存貯程序如下: Public Function SaveFile(Pathname As String) As String Dim objContext As ObjectContext Dim objRequest As Request Set objContext=GetObjectContext() Set objRequest=objContext("Request") 以下的一段代碼是進行文件存貯的有關操作 Dim FormData() As Byte,CLStr,DivStr Dim DataStart As Long,DataSize As Long DataSize=objRequest.TotalBytes Redim FormData(DataSize-1) FormData=objRequest.BinaryRead(DataSize) CLStr=ChrB(13) & ChrB(10) DataStart=InStrB(FormData,CLStr & CLStr)+4 DivStr=LeftB(FormData,InStrB(FormData,CLStr)-1) DataSize=InStrB(DataStart+1,FormData,DivStr)-DataStart-2 FormData=MidB(FormData,DataStart,DataSize) 創(chuàng)建一個二進制文件并將FormData寫入其中 Open Pathname For Binary As 1 Put #1,,FormData Close #1 SaveFile="OK!" End Function 第二種方法是利用ADO STREAM中提供的二進制文件操作方法來完成,,保存文件的語句是: StreamOBJ.SaveToFile (fileName,2),。在 這種操作中,我們可以將有關的操作存放在一個類文件中,,在應用時,,直接將該類文件包含在ASP程序中就可以了。具體處理方法,,請參閱有關介紹,。 三.文件上傳實現(xiàn)方法實例 實現(xiàn)文件上傳可使用組件或無組件方式。對于組件類,,比如說microsoft posting acceptor(簡稱mpa),,就是微軟公司發(fā)布的一個免費服務器組件,這類組件的安裝也比較方便,。對于微軟的mpa,,運行它的安裝文件就可以了。而一般的dll組件形式的,,我們則需要進行注冊,。例如,要使用aspcnUP.dll,,只要在Window 2000上執(zhí)行regsvr32 [path]aspcnUP.dll,,系統(tǒng)出現(xiàn)注冊成功的信息提示就可以使用該組件了;對于無組件類,,如www.5xsoft.com的無組件上傳類-upload_5xsoft,。在使用時,只要在處理程序中包含以下的語句就可以了: <!--#include FILE="upload.inc"--> set upload=new upload_5xSoft 建立上傳對象 有關的屬性與操作方法,,請參閱該組件的使用手冊,。 下面是以aspcnUP.dll組件為例,上傳部分類型文件的源代碼(upload.asp): <% @ language="vbscript" Set fileUP=Server.CreateObject("aspcn.Upload") fileUP.Maxsize=200000 fileUP.Path="d:upfile" fileUP.Upload For i=0 to fileUP.Count fieldname=fileUP.FieldName(i) If fileUP.FileType(fieldname)="zip" Or ileUP.FileType(fieldname)="rar" Then fileUP.Save fieldname End If Next Set fileUP=Nothing %> 四.結(jié)束語 瀏覽器/服務器應用模式還在快速地發(fā)展著,,在微軟新推出的ASP.NET中,,已經(jīng)內(nèi)置了文件上傳的功能,使用非常簡單方便,。作為一種全新的技術,,ASP.NET并不只是ASP的簡單升級,它是一個用于Web開發(fā)的全新框架,,其中包含了許多新的特性,。ASP.NET提供了更易于編寫,、結(jié)構(gòu)更清晰的代碼,利用這些代碼我們將會更容易地進行再利用和共享,,從而開發(fā)出更多更實用的程序來,。 |
|