熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

ASP文件上傳原理分析及實現實例

2013-11-13 10:25:13  來源: .NET編程 

  摘要在基於/的應用環境中上傳各種類型的文件一直是困擾用戶文件管理應用的難題之一在HTTP中上傳文件有三種機制RFCPUT和WebDAV常用的實現方法是利用在RFC中引入的一個新類型File以及ADO Stream對象本文對上述上傳方法及實現原理作了論述並給出了具體解決實例

    ASP FILE對象

  當前基於/模式的應用比較流行當用戶需要將文件傳輸到上時常用方法之一是運行FTP並將每個用戶的FTP默認目錄設為用戶的Web主目錄這樣用戶就能運行FTP客戶程序並上傳文件到指定的 Web目錄這就要求用戶必須懂得如何使用FTP客戶程序因此這種解決方案僅對熟悉FTP且富有經驗的用戶來說是可行的 如果我們能把文件上傳功能與Web集成使用戶僅用Web就能完成上傳任務這對於他們來說將是非常方便的但是一直以來由於File System Object的僅能傳送文本文件的局限所以ASP最大的難題就是文件上傳問題下面介紹的就是如何在基於HTTP協議的網頁中實現文件的上傳

  通過HTTP上傳的三種機制

  通過HTTP上傳有三種機制RFC PUT 和 WebDAV

  PUT 是在HTTP 引入了一個新的HTTP動詞當web收到一個HTTP PUT和對象名字它將會驗證用戶接收HTTP流的內容並把它直接存入web由於這可能會對一個web站點造成破壞並且還會失去HTTP最大的優勢可編程性在PUT的情況下自己處理請求沒有空間讓CGI或者ASP應用程序介入唯一讓你的應用程序捕獲PUT的方法是在低層操作ISAPI過濾層由於相應的原因PUT的應用很有限

  而WebDAV允許web內容的分布式認證與翻譯它引入了幾種新的HTTP動詞允許通過HTTP上傳鎖定/解鎖登記/檢驗web內容Office 中的Save to web 就是通過WebDAV來實現的如果你所感興趣的一切都是上傳內容WebDAV應用得非常出色它解決了很多問題 然而如果你需要在你的web應用程序裡面上傳文件WebDAV對你就毫無用處可言象HTTP PUT一樣那些WebDAV的動詞是被解釋的而不是web應用程序你需要工作在ISAPI過濾層來訪問WebDAV的這些動詞並在你的應用程序中解釋內容

  RFC () 最終被WC在HTML中接受前是作為一種建議標准它是一種非常簡單但是功能很強大的想法在表單字段中定義一個新類型  <INPUT TYPE=FILE>


    並且在表單本身加入了不同的編碼方案不再使用典型的  <FORM ACTION=formprocasp METHOD=POST>
    而是使用
 <FORM ACTION=formprocasp METHOD=POST ENCTYPE=multipart/formdata>

  這種編碼方案在傳送大量數據的時候比起缺省的application/xurlencoded表單編碼方案顯得效率要高得多URL編碼只有很有限的字符集使用任何超出字符集的字符必須用%nn代替這裡的nn表示相應的個十六進制數字例如即使是普通的空格字符也要用%代替而RFC使用多部分MIME編碼就象通常在email消息中看到的那樣不編碼來傳送大量數據而只是在數據周圍加上很少的簡單但實用的頭部主要的廠商都采用了建議的浏覽……按鈕用戶能很容易的使用本地打開文件…… 對話框選擇要上傳的文件

  RFC仍然將大多數文件上傳的靈活方法留給了你的web應用程序PUT用得很有限WebDAV對內容的作者很有用比如FrontPage用戶但是對想在web應用程序中加入文件上傳的web開發者來說很少用到因此RFC是在web應用程序中加入文件上傳的最好的辦法

  在實際應用中免費提供了Posting Acceptor ASP不懂multipart/formdata 編碼方案取而代之提供了Posting Acceptor Posting Acceptor是一種在上傳完成後接受REPOST到一個ASP頁的ISAPI應用程序

  Software Artisans的SAFileUp是最早的商業Active Server之一幾經改進現在作為一個純粹的ASP存在

  基於ASP的文件上傳實現原理分析

  基本原理是采用ADO Stream對象的BinaryRead方法將FORM中的所有數據讀出從中截取出所需的文件數據以二進制文件方式存盤

  下面是上傳文件頁面的一個例子()  <html>

<body>

<form name=Upload Method=Post Enctype=multipart/formdata
Action=Uploadasp>

<input type=file name=FileName>

<INPUT TYPE=Submit VALUE=Upload></TD>

</form>

</body>

</html>

    程序中使用了文件對象這樣在Uploadasp中采用BinaryRead方法讀來的原始數據就不僅僅是選擇的文件本身的數據還包含該文件在用戶硬盤上的路徑類型提交頁面的表單等相關信息的描述這樣我們就需從中提取出文件的具體內容根據分析數據的頭部信息與數據的分界線是兩對回車換行符尾部也有分隔信息我們可以采用類似以下的方法獲取文件數據
 Dim FormDataFormSizeDataStartCLStrDivStr
FormSize=RequestTotalBytes
FormData=RequestBinaryRead(FormSize)
CLStr=ChrB()&ChrB()
DataStart=InStrB(FormDataCLStr&CLStr)+
是兩對回車換行符的長度
DivStr=LeftB(FormDataInStrB(FormDataCLStr))
DataSize=InStrB(DataStart+FormDataDivStr)DataStart
FormData=MidB(FormDataDataStartDataSize)
    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 ByteCLStrDivStr
    Dim DataStart As LongDataSize As Long
    DataSize=objRequestTotalBytes
    Redim FormData(DataSize)
    FormData=objRequestBinaryRead(DataSize)
    CLStr=ChrB() & ChrB()
    DataStart=InStrB(FormDataCLStr & CLStr)+
    DivStr=LeftB(FormDataInStrB(FormDataCLStr))
    DataSize=InStrB(DataStart+FormDataDivStr)DataStart
    FormData=MidB(FormDataDataStartDataSize)
    創建一個二進制文件並將FormData寫入其中
    Open Pathname For Binary As
    Put #FormData
    Close #
    SaveFile=OK!
   End Function     第二種方法是利用ADO STREAM中提供的二進制文件操作方法來完成保存文件的語句是 StreamOBJSaveToFile (fileName)在 這種操作中我們可以將有關的操作存放在一個類文件中在應用時直接將該類文件包含在ASP程序中就可以了具體處理方法請參閱有關介紹

  三.文件上傳實現方法實例

  實現文件上傳可使用或無方式對於類比如說microsoft posting acceptor(簡稱mpa)就是公司發布的一個免費這類的安裝也比較方便對於的mpa運行它的安裝文件就可以了而一般的dll形式的我們則需要進行注冊例如要使用aspcnUPdll只要在Window 上執行regsvr [path\]aspcnUPdll系統出現注冊成功的信息提示就可以使用該了對於無類如的無上傳類upload_xsoft在使用時只要在處理程序中包含以下的語句就可以了
 <!#include FILE=uploadinc>
set upload=new upload_xSoft 建立上傳對象
    有關的屬性與操作方法請參閱該的使用手冊

    下面是詀spcnUPdll為例上傳部分類型文件的源代碼(uploadasp)  <% @ language=vbscript

 Set fileUP=ServerCreateObject(aspcnUpload)

 fileUPMaxsize=

 fileUPPath=d:\upfile

 fileUPUpload

 For i= to fileUPCount

  fieldname=fileUPFieldName(i)

  If fileUPFileType(fieldname)=zip Or ileUPFileType(fieldname)=rar
Then

   fileUPSave fieldname

  End If

 Next

 Set fileUP=Nothing

%>
 四.結束語

  應用模式還在快速地發展著在ASP.NET中已經內置了文件上傳的功能使用非常簡單方便作為一種全新的技術ASP.NET並不只是ASP的簡單升級它是一個用於Web開發的全新框架其中包含了許多新的特性ASP.NET提供了更易於編寫結構更清晰的代碼利用這些代碼我們將會更容易地進行再利用和共享從而開發出更多更實用的程序來


From:http://tw.wingwit.com/Article/program/net/201311/13562.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.