asp組件上傳---------之一

來源:互聯網
上載者:User
上傳 ASP 組件 FILE對象 
  當前,基於瀏覽器/伺服器模式的應用比較流行。當使用者需要將檔案傳輸到伺服器上時,常用方法之一是運行FTP伺服器並將每個使用者的FTP預設目錄設為使用者的Web主目錄,這樣使用者就能運行FTP客戶程式並上傳檔案到指定的 Web目錄。這就要求使用者必須懂得如何使用FTP客戶程式。因此,這種解決方案僅對熟悉FTP且富有經驗的使用者來說是可行的。 如果我們能把檔案上傳功能與Web整合,使使用者僅用Web瀏覽器就能完成上傳任務,這對於他們來說將是非常方便的。但是,一直以來,由於File System Object的僅能傳送文字檔的局限,所以ASP最大的難題就是檔案上傳問題。下面介紹的就是如何在基於HTTP協議的網頁中實現檔案的上傳。
  一.通過HTTP上傳的三種機制
  通過HTTP上傳有三種機制:RFC1867, PUT 和 WebDAV。
  PUT 是在HTTP 1.1引入了一個新的HTTP動詞。當web伺服器收到一個HTTP PUT和對象名字,它將會驗證使用者,接收HTTP流的內容,並把它直接存入web伺服器。由於這可能會對一個web網站造成破壞,並且還會失去HTTP最大的優勢:伺服器可程式化性。在PUT的情況下,伺服器自己處理請求:沒有空間讓CGI或者ASP應用程式介入。唯一讓你的應用程式捕獲PUT的方法是在低層操作,ISAPI過濾層。由於相應的原因,PUT的應用很有限。
  而WebDAV允許web內容的分布式認證與翻譯。它引入了幾種新的HTTP動詞,允許通過HTTP上傳,鎖定/解鎖,登記/檢驗web內容。Office 2000中的"Save to web" 就是通過WebDAV來實現的。如果你所感興趣的一切都是上傳內容,WebDAV應用得非常出色,它解決了很多問題。 然而,如果你需要在你的web應用程式裡面上傳檔案,WebDAV對你就毫無用處可言。象HTTP PUT一樣,那些WebDAV的動詞是被伺服器解釋的,而不是web應用程式。你需要工作在ISAPI過濾層來訪問WebDAV的這些動詞,並在你的應用程式中解釋內容。
  RFC1867 (http://www.ietf.org/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"> 
  這種編碼方案在傳送大量資料的時候,比起預設的"application/x-url-encoded"表單編碼方案,顯得效率要高得多。URL編碼只有很有限的字元集,使用任何超出字元集的字元,必須用’%nn’代替,這裡的nn表示相應的2個十六進位數字。例如,即使是普通的空白字元也要用’%20’代替。而RFC1867使用多部分MIME編碼,就象通常在e-mail訊息中看到的那樣,不編碼來傳送大量資料,而只是在資料周圍加上很少的簡單但實用的頭部。主要瀏覽器的廠商都採用了建議的"瀏覽..."按鈕,使用者能很容易的使用本地"開啟檔案..." 對話方塊選擇要上傳的檔案。
  RFC1867仍然將大多數檔案上傳的靈活方法留給了你的web應用程式。PUT用得很有限。WebDAV對內容的作者很有用,比如FrontPage使用者,但是對想在web應用程式中加入檔案上傳的web開發人員來說很少用到。因此,RFC1867是在web應用程式中加入檔案上傳的最好的辦法。
  在實際應用中,微軟免費提供了Posting Acceptor 。ASP不懂"multipart/form-data" 編碼方案。取而代之,微軟提供了Posting Acceptor ,Posting Acceptor是一種在上傳完成後,接受REPOST到一個ASP頁的ISAPI應用程式。
  Software Artisans的SA-FileUp是最早的商業Active Server組件之一。幾經改進,現在作為一個純粹的ASP組件存在。
        二.基於ASP的檔案上傳實現原理分析
  基本原理是:採用ADO Stream對象的BinaryRead方法將FORM中的所有資料讀出,從中截取出所需的檔案資料,以二進位檔案方式存檔。
  下面是上傳檔案頁面的一個例子(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方法讀來的未經處理資料就不僅僅是選擇的檔案本身的資料,還包含該檔案在使用者硬碟上的路徑、類型、提交頁面的表單網域名稱等相關資訊的描述,這樣我們就需從中提取出檔案的具體內容。根據分析,資料的頭部資訊與資料的分界線是兩對斷行符號分行符號,尾部也有分隔資訊,我們可以採用類似以下的方法擷取檔案資料。
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就是檔案的內容了。 
  中間根據需要,可進行相應的處理。最後的工作就是將檔案儲存了。儲存的方法可以有兩種:一種是利用VB或VC之類程式中的二進位檔案操作方法,在工程中加入適當的類型庫,最終編譯成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) 
    ’建立一個二進位檔案並將FormData寫入其中 
    Open Pathname For Binary As 1 
    Put #1,,FormData 
    Close #1 
    SaveFile="OK!" 
   End Function 
  第二種方法是利用ADO STREAM中提供的二進位檔案操作方法來完成,儲存檔案的語句是: StreamOBJ.SaveToFile (fileName,2)。在 這種操作中,我們可以將有關的操作存放在一個類檔案中,在應用時,直接將該類檔案包含在ASP程式中就可以了。具體處理方法,請參閱有關介紹。



聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.