這篇文章給大家分享的是有關(guān)如何使用XML技術(shù)上傳文件的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。
為穆棱等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計制作服務(wù),及穆棱網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站設(shè)計、穆棱網(wǎng)站設(shè)計,以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!xml技術(shù)上傳文件
類型: XML/Biztalk
概述
本文講解了一個使用XML技術(shù)上傳文件的例子,使用該方法沒有傳統(tǒng)方法中的種種限制。 這個例子講述了如何使用MSXML3.0和ADO Stream對象來實(shí)現(xiàn)這種新的上傳方法。好處有很多,比如,不需要專用的上傳組件。
引言
為了在HTML網(wǎng)頁中獲得上傳功能,在客戶端我們可以使用如下格式的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 >
這種方案在客戶端和服務(wù)器端的使用都有很多限制。首先,我們必須使用POST方法,因?yàn)镚ET方法無法處理這樣的表單數(shù)據(jù)。并且,沒有什么方法可以在不使用表單的情況下引發(fā)一個POST動作。把數(shù)據(jù)發(fā)送給表單處理程序后,瀏覽器將會把處理程序作為新頁面加載,然后使用者會看到一個不討人喜歡的頁面轉(zhuǎn)換過程。
ENCTYPE屬性為表單定義了MIME編碼方式,上傳文件的表單的ENCTYPE屬性必須使用“multipart/form-data”。把這個屬性設(shè)置為“multipart/form-data”就創(chuàng)建了一個與傳統(tǒng)結(jié)構(gòu)不同的POST緩沖區(qū)(復(fù)合結(jié)構(gòu)),ASP的Request對象無法訪問這樣的表單內(nèi)容。所以,我們可以使用Request.binaryRead方法來訪問這些數(shù)據(jù),但是無法使用腳本語言來完成這一切。Request.binaryRead方法返回一個VTarray型數(shù)據(jù)(只包含無符號一字節(jié)字符的Variant型數(shù)組)。但是腳本語言只能處理Variant型數(shù)據(jù)。為了解決這個問題,只能使用專用的ASP上傳組件,或者ISAPI擴(kuò)展程序,比如CPSHOST.DLL。這是設(shè)計上的限制。
新的上傳方案
需要按照如下步驟操作。
客戶端:
使用MSXML 3.0創(chuàng)建一個XML文檔
創(chuàng)建一個針對二進(jìn)制內(nèi)容的XML節(jié)點(diǎn)
使用ADO Stream object將上傳的文件數(shù)據(jù)放入該節(jié)點(diǎn)
使用xmlhttp對象把這個XML文檔發(fā)送給Web服務(wù)器
服務(wù)器端:
從Request對象中讀出XML文檔讀出二進(jìn)制節(jié)點(diǎn)中的數(shù)據(jù)并且存儲到服務(wù)器上的文件中。當(dāng)然,我們也可以將其存儲到數(shù)據(jù)庫的BLOB型字段中。
在解釋這段代碼之前,我們可以對這個方案進(jìn)行一些思考。
對XML的思考
XML格式支持很多數(shù)據(jù)類型,比如numeric, float, character等等。很多作者將XML定義為ASCII格式,但是我們不能忽視,XML技術(shù)還可以使用“bin.base64”數(shù)據(jù)類型來描述二進(jìn)制信息。這個特性在MS XML3.0解析器重得到完全的支持,但是目前還需要一些特別設(shè)置。該對象提供一些可以對二進(jìn)制數(shù)據(jù)進(jìn)行完全控制的屬性:
obj_node.dataType - 該可讀寫的屬性定義了特定節(jié)點(diǎn)的數(shù)據(jù)類型。MSXML解析器支持更多的數(shù)據(jù)類型(參見MSDN:http://msdn.microsoft.com/library/PSDk/xmlsdk/xmls3z1v.htm)
對于二進(jìn)制數(shù)據(jù),我們可以使用“bin.base64”類型。
obj_node.nodeTypedValue - 該可讀寫屬性包含了按照制定類型表示的指定節(jié)點(diǎn)的數(shù)據(jù)。
我們可以創(chuàng)建一個包含多個bin.base64類型節(jié)點(diǎn)的XML文檔,節(jié)點(diǎn)中包含上傳的文件。這點(diǎn)特性可以使用一個POST一次上傳多個文件。
我們可以使用XMLHttPRequest對象和POST方法發(fā)送一個XML文檔給Web服務(wù)器。該對象為HTTP服務(wù)器提供了客戶端協(xié)議支持,允許在Web服務(wù)器上發(fā)送和接受MS XMLDOM對象。XMLHttpRequest是Internet Explorer 5內(nèi)置的COM對象(不需要定制安裝),并且發(fā)送完畢后無需轉(zhuǎn)換頁面。
對ADO Stream對象的思考
我們可以在客戶端創(chuàng)建一個包含一個或者多個二進(jìn)制節(jié)點(diǎn)的XML文檔。我們還必須把文件內(nèi)容填入節(jié)點(diǎn)中。但是很不幸,腳本語言不能訪問本地文件系統(tǒng),并且Scripting.FileSystem對象(是Win32系統(tǒng)的內(nèi)置對象)到目前為止還不能訪問二進(jìn)制文件。這是設(shè)計上的限制。所以我們需要另外找一個可以提供對本地二進(jìn)制文件的訪問的COM對象。
ADO Stream對象(MDAC 2.5中的組件)提供了讀、寫和管理二進(jìn)制流數(shù)據(jù)的手段。字節(jié)流的內(nèi)容可以是文本,或者二進(jìn)制數(shù)據(jù),并且沒有容量上的限制。在ADO 2.5中,Microsoft對Stream對象的介紹不屬于ADO對象結(jié)構(gòu)的任何一層,所以,我們無需捆綁即可使用該對象。
本文中使用Stream對象來訪問文件內(nèi)容,再把內(nèi)容存入XML節(jié)點(diǎn)。
客戶端
以下示例代碼使用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 > // 上傳函數(shù) function btn_send.onclick() { // 創(chuàng)建 ADO-stream 對象 var ado_stream = new ActiveXObject("ADODB.Stream"); // 創(chuàng)建包含默認(rèn)頭信息和根節(jié)點(diǎn)的 XML文檔 var xml_dom = new ActiveXObject("MSXML2.DOMDocument"); xml_dom.loadXML(' '); // 指定數(shù)據(jù)類型 xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes"); // 創(chuàng)建一個新節(jié)點(diǎn),設(shè)置其為二進(jìn)制數(shù)據(jù)節(jié)點(diǎn) 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"); // 將文件內(nèi)容存入XML節(jié)點(diǎn) l_node1.nodeTypedValue = ado_stream.Read(-1); // -1=adReadAll ado_stream.Close(); xml_dom.documentElement.appendChild(l_node1); // 可以創(chuàng)建多個二進(jìn)制節(jié)點(diǎn),一次上傳多個文件 // 把XML文檔發(fā)送到Web服務(wù)器 var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP"); xmlhttp.open("POST","./file_recieve.asp",false); xmlhttp.send(xml_dom); // 顯示服務(wù)器返回的信息 div_message.innerHTML = xmlhttp.ResponseText; } < /SCRIPT >
服務(wù)器端
以下代碼使用相同的對象提供服務(wù)器端的上傳處理功能。
< %@ LANGUAGE=VBScript% > < % Option Explicit Response.Expires = 0 ' 定義變量和對象。 dim ado_stream dim xml_dom dim xml_file1 ' 創(chuàng)建 Stream 對象 set ado_stream = Server.CreateObject("ADODB.Stream") ' 從Request對象創(chuàng)建 XMLDOM對象 set xml_dom = Server.CreateObject("MSXML2.DOMDocument") xml_dom.load(request) ' 讀出包含二進(jìn)制數(shù)據(jù)的節(jié)點(diǎn) set xml_file1 = xml_dom.selectSingleNode("root/file1") ' 打開Stream對象,把數(shù)據(jù)存入其中 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 ' 向?yàn)g覽器返回信息 Response.Write "Upload successful!" % >
也可以使用Stream對象把數(shù)據(jù)放到數(shù)據(jù)庫的BLOB型字段中。
使用該方法的益處
不引起頁面轉(zhuǎn)換。
不需要專用組件。
可同時上傳多個文件。
這段程序是純腳本寫成的,可以很容易的插入到其他代碼中,而不需要任何HTML對象的配合。還可以把這個邏輯在任何支持COM標(biāo)準(zhǔn)的語言中實(shí)現(xiàn)。
系統(tǒng)安全考慮
該方法只能使用于內(nèi)部網(wǎng)絡(luò),因?yàn)樗枰狪E5的安全級別設(shè)置為“低”。必須:
允許腳本和ActiveX對象。該設(shè)置允許瀏覽器執(zhí)行類似 "myobj = new activexobject(...)"的 JScript語句;
必須允許穿越域訪問數(shù)據(jù)源。這個設(shè)置允許在客戶端使用Stream對象。還必須在服務(wù)器和客戶端都安裝MS XML DOM 3.0 和MDAC 2.5 。
感謝各位的閱讀!關(guān)于“如何使用XML技術(shù)上傳文件”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點(diǎn)與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。