★33°空間‰


                                 ----★七彩服飾  【最潮拜☆日單精品】【Esprit】【Hotwind】滿150包郵-女裝-流行女裝    www.7color.hb.cn

                                 ----智力比知識重要,素質比智力重要,覺悟比素質更重要
          posts - 110,comments - 35,trackbacks - 0
          為了在HTML網頁中獲得上傳功能,在客戶端我們可以使用如下格式的FORM:



          < FORM NAME="myForm" ACTION="TargetURL.asp" ENCTYPE="multipart/form-data"METHOD="post" >

          < INPUT TYPE="file" NAME="myFile" >

          < INPUT TYPE="submit" VALUE="Upload File" >

          < /FORM >



            這種方案在客戶端和服務器端的使用都有很多限制。首先,我們必須使用POST方法,因為GET方法無法處理這樣的表單數據。并且,沒有什么方法可以在不使用表單的情況下引發一個POST動作。把數據發送給表單處理程序后,瀏覽器將會把處理程序作為新頁面加載,然后使用者會看到一個不討人喜歡的頁面轉換過程。



            ENCTYPE屬性為表單定義了MIME編碼方式,上傳文件的表單的ENCTYPE屬性必須使用“multipart/form-data”。把這個屬性設置為“multipart/form-data”就創建了一個與傳統結構不同的POST緩沖區(復合結構),ASP的Request對象無法訪問這樣的表單內容。所以,我們可以使用Request.binaryRead方法來訪問這些數據,但是無法使用腳本語言來完成這一切。Request.binaryRead方法返回一個VTarray型數據(只包含無符號一字節字符的Variant型數組)。但是腳本語言只能處理Variant型數據。為了解決這個問題,只能使用專用的ASP上傳組件,或者ISAPI擴展程序,比如CPSHOST.DLL。這是設計上的限制。



          新的上傳方案



          需要按照如下步驟操作。

          客戶端:



          使用MSXML 3.0創建一個XML文檔

          創建一個針對二進制內容的XML節點

          使用ADO Stream object將上傳的文件數據放入該節點

          使用XMLHTTP對象把這個XML文檔發送給Web服務器







          服務器端:



            從Request對象中讀出XML文檔讀出二進制節點中的數據并且存儲到服務器上的文件中。當然,我們也可以將其存儲到數據庫的BLOB型字段中。

            在解釋這段代碼之前,我們可以對這個方案進行一些思考。



          對XML的思考



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



            obj_node.dataType - 該可讀寫的屬性定義了特定節點的數據類型。MSXML解析器支持更多的數據類型(參見MSDN:http://msdn.microsoft.com/library/psdk/xmlsdk/xmls3z1v.htm)

          對于二進制數據,我們可以使用“bin.base64”類型。



            obj_node.nodeTypedValue - 該可讀寫屬性包含了按照制定類型表示的指定節點的數據。

          我們可以創建一個包含多個bin.base64類型節點的XML文檔,節點中包含上傳的文件。這點特性可以使用一個POST一次上傳多個文件。



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





          對ADO Stream對象的思考



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



            ADO Stream對象(MDAC 2.5中的組件)提供了讀、寫和管理二進制流數據的手段。字節流的內容可以是文本,或者二進制數據,并且沒有容量上的限制。在ADO 2.5中,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





          < /BODY >

          < /HTML >



          < SCRIPT LANGUAGE=JavaScript >



          // 上傳函數

          function btn_send.onclick()

          {

          // 創建 ADO-stream 對象

          var ado_stream = new ActiveXObject("ADODB.Stream");



          // 創建包含默認頭信息和根節點的 XML文檔

          var xml_dom = new ActiveXObject("MSXML2.DOMDocument");

          xml_dom.loadXML(' ');

          // 指定數據類型

          xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");



          // 創建一個新節點,設置其為二進制數據節點

          var l_node1 = xml_dom.createElement("file1");

          l_node1.dataType = "bin.base64";

          // 打開Stream對象,讀源文件

          ado_stream.Type = 1; // 1=adTypeBinary

          ado_stream.Open();

          ado_stream.LoadFromFile("c:\\tmp\\myfile.doc");

          // 將文件內容存入XML節點

          l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll

          ado_stream.Close();

          xml_dom.documentElement.appendChild(l_node1);



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



          // 把XML文檔發送到Web服務器

          var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");

          xmlhttp.open("POST","./file_recieve.asp",false);

          xmlhttp.send(xml_dom);

          // 顯示服務器返回的信息

          div_message.innerHTML = xmlhttp.ResponseText;

          }

          < /SCRIPT >



          服務器端



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





          < %@ LANGUAGE=VBScript% >

          < % Option Explicit

          Response.Expires = 0



          ' 定義變量和對象。

          dim ado_stream

          dim xml_dom

          dim xml_file1



          ' 創建 Stream 對象

          set ado_stream = Server.CreateObject("ADODB.Stream")

          ' 從Request對象創建 XMLDOM對象

          set xml_dom = Server.CreateObject("MSXML2.DOMDocument")

          xml_dom.load(request)

          ' 讀出包含二進制數據的節點

          set xml_file1 = xml_dom.selectSingleNode("root/file1")



          ' 打開Stream對象,把數據存入其中

          ado_stream.Type = 1 ' 1=adTypeBinary

          ado_stream.open

          ado_stream.Write xml_file1.nodeTypedValue

          ' 文件存盤

          ado_stream.SaveToFile "c:\tmp\upload1.doc",2 ' 2=adSaveCreateOverWrite

          ado_stream.close



          ' 銷毀對象

          set ado_stream = Nothing

          set xml_dom = Nothing

          ' 向瀏覽器返回信息

          Response.Write "Upload successful!"

          % >



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



          使用該方法的益處



          不引起頁面轉換。

          不需要專用組件。

          可同時上傳多個文件。



            這段程序是純腳本寫成的,可以很容易的插入到其他代碼中,而不需要任何HTML對象的配合。還可以把這個邏輯在任何支持COM標準的語言中實現。



          系統安全考慮



            該方法只能使用于內部網絡,因為它需要IE5的安全級別設置為“低”。必須:



            允許腳本和ActiveX對象。該設置允許瀏覽器執行類似 "myobj = new activexobject(...)"的 JScript語句;



            必須允許穿越域訪問數據源。這個設置允許在客戶端使用Stream對象。還必須在服務器和客戶端都安裝MS XML DOM 3.0 和MDAC 2.5 。
          posted on 2006-10-09 08:59 圣域飛俠 閱讀(669) 評論(0)  編輯  收藏 所屬分類: 轉載
          主站蜘蛛池模板: 通州区| 宁德市| 天门市| 镇坪县| 泸州市| 五台县| 三穗县| 兴海县| 思南县| 扎赉特旗| 大城县| 福鼎市| 绍兴县| 昆山市| 舞钢市| 新巴尔虎右旗| 石河子市| 巫山县| 呼和浩特市| 乌什县| 建宁县| 湘西| 余江县| 错那县| 建昌县| 南溪县| 离岛区| 孙吴县| 临夏县| 阳泉市| 绍兴县| 嘉祥县| 遵义县| 琼结县| 昌吉市| 布拖县| 旺苍县| 灌阳县| 博罗县| 广饶县| 广昌县|