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

XML文件上傳技術

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

  概述
    本文講解了一個使用XML技術上傳文件的例子使用該方法沒有傳統方法中的種種限制 這個例子講述了如何使用MSXML和ADO Stream對象來實現這種新的上傳方法好處有很多比如不需要專用的上傳組件

  引言
    為了在HTML網頁中獲得上傳功能在客戶端我們可以使用如下格式的FORM

     <FORM NAME=myForm
    ACTION=TargetURLASP
    ENCTYPE=multipart/formdata
    METHOD=post>
    <INPUT TYPE=file NAME=myFile>
    <INPUT TYPE=submit VALUE=Upload File>
    </FORM>

  這種方案在客戶端和服務器端的使用都有很多限制首先我們必須使用POST方法因為GET方法無法處理這樣的表單數據並且沒有什麼方法可以在不使用表單的情況下引發一個POST動作把數據發送給表單處理程序後浏覽器將會把處理程序作為新頁面加載然後使用者會看到一個不討人喜歡的頁面轉換過程
    ENCTYPE屬性為表單定義了MIME編碼方式上傳文件的表單的ENCTYPE屬性必須使用multipart/formdata把這個屬性設置為multipart/formdata就創建了一個與傳統結構不同的POST緩沖區(復合結構)ASP的Request對象無法訪問這樣的表單內容所以我們可以使用RequestbinaryRead方法來訪問這些數據但是無法使用腳本語言來完成這一切RequestbinaryRead方法返回一個VTarray型數據(只包含無符號一字節字符的Variant型數組)但是腳本語言只能處理Variant型數據為了解決這個問題只能使用專用的ASP上傳組件或者ISAPI擴展程序比如CPSHOSTDLL這是設計上的限制

  新的上傳方案

  需要按照如下步驟操作
    客戶端

  使用MSXML 創建一個XML文檔
    創建一個針對二進制內容的XML節點
    使用ADO Stream object將上傳的文件數據放入該節點
    使用XMLHTTP對象把這個XML文檔發送給Web服務器

  服務器端
    從Request對象中讀出XML文檔
    讀出二進制節點中的數據並且存儲到服務器上的文件中當然我們也可以將其存儲到數據庫的BLOB型字段中
    在解釋這段代碼之前我們可以對這個方案進行一些思考

  對XML的思考

  XML格式支持很多數據類型比如numeric float character等等很多作者將XML定義為ASCII格式但是我們不能忽視XML技術還可以使用binbase數據類型來描述二進制信息這個特性在MS XML解析器重得到完全的支持但是目前還需要一些特別設置該對象提供一些可以對二進制數據進行完全控制的屬性

  obj_nodedataType 該可讀寫的屬性定義了特定節點的數據類型MSXML解析器支持更多的數據類型(參見MSDN
    對於二進制數據我們可以使用binbase類型

  obj_nodenodeTypedValue 該可讀寫屬性包含了按照制定類型表示的指定節點的數據
    我們可以創建一個包含多個binbase類型節點的XML文檔節點中包含上傳的文件這點特性可以使用一個POST一次上傳多個文件

  我們可以使用XMLHttpRequest對象和POST方法發送一個XML文檔給Web服務器該對象為HTTP服務器提供了客戶端協議支持允許在Web服務器上發送和接受MS XMLDOM對象XMLHttpRequest是Internet Explorer 內置的COM對象(不需要定制安裝)並且發送完畢後無需轉換頁面

  對ADO Stream對象的思考

  我們可以在客戶端創建一個包含一個或者多個二進制節點的XML文檔我們還必須把文件內容填入節點中但是很不幸腳本語言不能訪問本地文件系統並且ScriptingFileSystem對象(是Win系統的內置對象)到目前為止還不能訪問二進制文件這是設計上的限制所以我們需要另外找一個可以提供對本地二進制文件的訪問的COM對象

  ADO Stream對象(MDAC 中的組件)提供了讀寫和管理二進制流數據的手段字節流的內容可以是文本或者二進制數據並且沒有容量上的限制在ADO Microsoft對Stream對象的介紹不屬於ADO對象結構的任何一層所以我們無需捆綁即可使用該對象

  本文中使用Stream對象來訪問文件內容再把內容存入XML節點

  客戶端

  以下示例代碼使用Stream和MSXML對象完成文件上傳動作

   <HTML>
    <HEAD><TITLE>File Send</TITLE></HEAD>
    <BODY>
    <INPUT id=btn_send name=btn_send type=button value=FILE SEND>
    <DIV id=div_message>Ready</DIV>
    </BODY>
    </HTML>

  <SCRIPT LANGUAGE=JavaScript>

  // 上傳函數
    function btn_sendonclick()
    {
    // 創建 ADOstream 對象
    var ado_stream = new ActiveXObject(ADODBStream);

  // 創建包含默認頭信息和根節點的 XML文檔
    var XML_dom = new ActiveXObject(MSXMLDOMDocument);
    XML_domloadXML(<?XML version= ?> <root/>);
    // 指定數據類型
    XML_domdocumentElementsetAttribute(XMLns:dt urn:schemasmicrosoftcom:datatypes);

  // 創建一個新節點設置其為二進制數據節點
    var l_node = XML_domcreateElement(file);
    l_nodedataType = binbase;
    // 打開Stream對象讀源文件
    ado_streamType = ; // =adTypeBinary
    ado_streamOpen();
    ado_streamLoadFromFile(c:\\tmp\\myfiledoc);
    // 將文件內容存入XML節點
    l_nodenodeTypedValue = ado_streamRead(); // =adReadAll
    ado_streamClose();
    XML_domdocumentElementappendChild(l_node);

  // 可以創建多個二進制節點一次上傳多個文件

  // 把XML文檔發送到Web服務器
    var XMLhttp = new ActiveXObject(MicrosoftXMLHTTP);
    XMLhttpopen(POST/file_recieveASPfalse);
    XMLhttpsend(XML_dom);
    // 顯示服務器返回的信息
    div_messageinnerHTML = XMLhttpResponseText;
    }
    </SCRIPT>

  服務器端

  以下代碼使用相同的對象提供服務器端的上傳處理功能

  <%@ LANGUAGE=VBScript%>
    <% Option Explicit
    ResponseExpires =

   定義變量和對象
    dim ado_stream
    dim XML_dom
    dim XML_file

   創建 Stream 對象
    set ado_stream = ServerCreateObject(ADODBStream)
    從Request對象創建 XMLDOM對象
    set XML_dom = ServerCreateObject(MSXMLDOMDocument)
    XML_domload(request)
    讀出包含二進制數據的節點
    set XML_file = XML_domselectSingleNode(root/file)

   打開Stream對象把數據存入其中
    ado_streamType = =adTypeBinary
    ado_streamopen
    ado_streamWrite XML_filenodeTypedValue
    文件存盤
    ado_streamSaveToFile c:\tmp\uploaddoc =adSaveCreateOverWrite
    ado_streamclose

   銷毀對象
    set ado_stream = Nothing
    set XML_dom = Nothing
    向浏覽器返回信息
    ResponseWrite Upload successful!
    %>


    也可以使用Stream對象把數據放到數據庫的BLOB型字段中

  使用該方法的益處

  不引起頁面轉換
    不需要專用組件
    可同時上傳多個文件
    這段程序是純腳本寫成的可以很容易的插入到其他代碼中而不需要任何HTML對象的配合還可以把這個邏輯在任何支持COM標准的語言中實現

  系統安全考慮

  該方法只能使用於內部網絡因為它需要IE的安全級別設置為必須

  允許腳本和ActiveX對象該設置允許浏覽器執行類似 myobj = new activexobject()的 JScript語句
    必須允許穿越域訪問數據源這個設置允許在客戶端使用Stream對象還必須在服務器和客戶端都安裝MS XML DOM 和MDAC


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