六月婷婷综合激情-六月婷婷综合-六月婷婷在线观看-六月婷婷在线-亚洲黄色在线网站-亚洲黄色在线观看网站

明輝手游網(wǎng)中心:是一個(gè)免費(fèi)提供流行視頻軟件教程、在線學(xué)習(xí)分享的學(xué)習(xí)平臺(tái)!

XML技術(shù)上傳文件

[摘要]概述本文講解了一個(gè)使用XML技術(shù)上傳文件的例子,使用該方法沒有傳統(tǒng)方法中的種種限制。 這個(gè)例子講述了如何使用MSXML3.0和ADO Stream對(duì)象來實(shí)現(xiàn)這種新的上傳方法。好處有很多,比如,不需要...

概述
本文講解了一個(gè)使用XML技術(shù)上傳文件的例子,使用該方法沒有傳統(tǒng)方法中的種種限制。 這個(gè)例子講述了如何使用MSXML3.0和ADO Stream對(duì)象來實(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ā)一個(gè)POST動(dòng)作。把數(shù)據(jù)發(fā)送給表單處理程序后,瀏覽器將會(huì)把處理程序作為新頁面加載,然后使用者會(huì)看到一個(gè)不討人喜歡的頁面轉(zhuǎn)換過程。
ENCTYPE屬性為表單定義了MIME編碼方式,上傳文件的表單的ENCTYPE屬性必須使用“multipart/form-data”。把這個(gè)屬性設(shè)置為“multipart/form-data”就創(chuàng)建了一個(gè)與傳統(tǒng)結(jié)構(gòu)不同的POST緩沖區(qū)(復(fù)合結(jié)構(gòu)),ASP的Request對(duì)象無法訪問這樣的表單內(nèi)容。所以,我們可以使用Request.binaryRead方法來訪問這些數(shù)據(jù),但是無法使用腳本語言來完成這一切。Request.binaryRead方法返回一個(gè)VTarray型數(shù)據(jù)(只包含無符號(hào)一字節(jié)字符的Variant型數(shù)組)。但是腳本語言只能處理Variant型數(shù)據(jù)。為了解決這個(gè)問題,只能使用專用的ASP上傳組件,或者ISAPI擴(kuò)展程序,比如CPSHOST.DLL。這是設(shè)計(jì)上的限制。

新的上傳方案

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

使用MSXML 3.0創(chuàng)建一個(gè)XML文檔
創(chuàng)建一個(gè)針對(duì)二進(jìn)制內(nèi)容的XML節(jié)點(diǎn)
使用ADO Stream object將上傳的文件數(shù)據(jù)放入該節(jié)點(diǎn)
使用XMLHTTP對(duì)象把這個(gè)XML文檔發(fā)送給Web服務(wù)器

服務(wù)器端:
從Request對(duì)象中讀出XML文檔
讀出二進(jìn)制節(jié)點(diǎn)中的數(shù)據(jù)并且存儲(chǔ)到服務(wù)器上的文件中。當(dāng)然,我們也可以將其存儲(chǔ)到數(shù)據(jù)庫的BLOB型字段中。
在解釋這段代碼之前,我們可以對(duì)這個(gè)方案進(jìn)行一些思考。

對(duì)XML的思考

XML格式支持很多數(shù)據(jù)類型,比如numeric, float, character等等。很多作者將XML定義為ASCII格式,但是我們不能忽視,XML技術(shù)還可以使用“bin.base64”數(shù)據(jù)類型來描述二進(jìn)制信息。這個(gè)特性在MS XML3.0解析器重得到完全的支持,但是目前還需要一些特別設(shè)置。該對(duì)象提供一些可以對(duì)二進(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)
對(duì)于二進(jìn)制數(shù)據(jù),我們可以使用“bin.base64”類型。

obj_node.nodeTypedValue - 該可讀寫屬性包含了按照制定類型表示的指定節(jié)點(diǎn)的數(shù)據(jù)。
我們可以創(chuàng)建一個(gè)包含多個(gè)bin.base64類型節(jié)點(diǎn)的XML文檔,節(jié)點(diǎn)中包含上傳的文件。這點(diǎn)特性可以使用一個(gè)POST一次上傳多個(gè)文件。

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


對(duì)ADO Stream對(duì)象的思考

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

ADO Stream對(duì)象(MDAC 2.5中的組件)提供了讀、寫和管理二進(jìn)制流數(shù)據(jù)的手段。字節(jié)流的內(nèi)容可以是文本,或者二進(jìn)制數(shù)據(jù),并且沒有容量上的限制。在ADO 2.5中,Microsoft對(duì)Stream對(duì)象的介紹不屬于ADO對(duì)象結(jié)構(gòu)的任何一層,所以,我們無需捆綁即可使用該對(duì)象。

本文中使用Stream對(duì)象來訪問文件內(nèi)容,再把內(nèi)容存入XML節(jié)點(diǎn)。


客戶端

以下示例代碼使用Stream和MSXML對(duì)象完成文件上傳動(dòng)作。

<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>

// 上傳函數(shù)
function btn_send.onclick()
{
// 創(chuàng)建 ADO-stream 對(duì)象
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('<?xml version="1.0" ?> <root/>');
// 指定數(shù)據(jù)類型
xml_dom.documentElement.setAttribute("xmlns:dt", "urn:schemas-microsoft-com:datatypes");

// 創(chuàng)建一個(gè)新節(jié)點(diǎn),設(shè)置其為二進(jìn)制數(shù)據(jù)節(jié)點(diǎn)
var l_node1 = xml_dom.createElement("file1");
l_node1.dataType = "bin.base64";
// 打開Stream對(duì)象,讀源文件
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)建多個(gè)二進(jìn)制節(jié)點(diǎn),一次上傳多個(gè)文件

// 把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ù)器端

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

<%@ LANGUAGE=VBScript%>
<% Option Explicit
Response.Expires = 0

' 定義變量和對(duì)象。
dim ado_stream
dim xml_dom
dim xml_file1

' 創(chuàng)建 Stream 對(duì)象
set ado_stream = Server.CreateObject("ADODB.Stream")
' 從Request對(duì)象創(chuàng)建 XMLDOM對(duì)象
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對(duì)象,把數(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

' 銷毀對(duì)象
set ado_stream = Nothing
set xml_dom = Nothing
' 向?yàn)g覽器返回信息
Response.Write "Upload successful!"
%>

也可以使用Stream對(duì)象把數(shù)據(jù)放到數(shù)據(jù)庫的BLOB型字段中。

使用該方法的益處

不引起頁面轉(zhuǎn)換。
不需要專用組件。
可同時(shí)上傳多個(gè)文件。
這段程序是純腳本寫成的,可以很容易的插入到其他代碼中,而不需要任何HTML對(duì)象的配合。還可以把這個(gè)邏輯在任何支持COM標(biāo)準(zhǔn)的語言中實(shí)現(xiàn)。

系統(tǒng)安全考慮

該方法只能使用于內(nèi)部網(wǎng)絡(luò),因?yàn)樗枰狪E5的安全級(jí)別設(shè)置為“低”。必須:

允許腳本和ActiveX對(duì)象。該設(shè)置允許瀏覽器執(zhí)行類似 "myobj = new activexobject(...)"的 JScript語句;
必須允許穿越域訪問數(shù)據(jù)源。這個(gè)設(shè)置允許在客戶端使用Stream對(duì)象。還必須在服務(wù)器和客戶端都安裝MS XML DOM 3.0 和MDAC 2.5 。





標(biāo)簽:XML技術(shù)上傳文件 
主站蜘蛛池模板: 日本免费在线 | 日本亚洲中午字幕乱码 | 日日做夜夜爽夜夜爽 | 亚洲a视频在线观看 | 亚洲图区欧美 | 色综合久久久久久中文网 | 青青国产成人久久91网站站 | 亚洲精品国产综合久久一线 | 天天干夜夜怕 | 天堂网在线播放 | 色噜噜狠狠色综合久 | 在线国产一区二区 | 亚洲影院国产 | 日本爱爱小视频 | 日本免费不卡在线一区二区三区 | 欧美一级黄色带 | 日日噜噜夜夜狠狠久久aⅴ 日日噜噜夜夜狠狠扒开双腿 | 四虎影视www四虎免费 | 亚洲国产天堂在线观看 | 天天色天天操天天 | 中文字幕在线不卡视频 | 全部毛片免费看 | 色碰视频 | 小明视频免费永久在线网 | 性刺激欧美三级在线现看中文 | 亚洲第一网站免费视频 | 色色视频网 | 色91视频| 日日摸夜夜搂人人要 | 一级毛片网 | 亚洲国产艾杏在线观看 | 日韩精品在线第一页 | 中文字幕欧美日韩久久 | 婷婷四房综合激情五月性色 | 四虎8848精品永久在线观看 | 青青草原影视 | 四虎精品成人免费影视 | 日本片免费观看一区二区 | 丝袜美腿美女被狂躁在线观看 | 色婷婷丁香六月 | 色呦呦视频在线观看 |