如今xml技术渐渐成熟,成为了一种网站传播数据的又一种方式,下面是我用xmlhttp写的一个多文件上传程序.包括客户端和服务端两部分..
本程序的实现是利用xml可以在其结点存放经base64编码的二进制文件,先在客户端生成包含要传文件的xml 再,通过xmlhttp发送到服务端.下面是客户端:
<html>
<!--
xmlupload.htm by 九天神龙
xkou@hotmail.com
//-->
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<title>XML上传客户端</title>
提交到asp页面<input type=text id="postto" size="30"
value="http://localhost/up.asp"
/><br>
上传到服务器路径<input value="\"
type=text id="postpath" onblur="if(this.value.charAt(this.value.length-1)!='\\') this.value+='\\';" /><br>
设定文件上传数:<input type=text value=5 size=5 id="upnum"> <button onclick=displayForm(parseInt(upnum.value));>设定</button>
<div id=div1></div><button onclick=sendfile()>上传</button><br /><br />返回信息:
<div id="div_message" style="margin-left:20px;padding:10px;border:1px solid silver;"/>
<SCRIPT LANGUAGE="JavaScript">
<!--
function displayForm(i){ //显示指定数目的textbox
if(i<2) i=2;
var tal="";
for(a=1;a<=i;a++){
str=a+".<input type=file id='upfile'><br />";
tal+=str;
}
div1.innerHTML=tal;
}
displayForm(2);
function sendfile(){
//创建dom对象
var xmldom=new ActiveXObject("MSXML2.DOMDocument");
xmldom.async=false;
//载入外部xml 文件,在与本文件同一目录下建一 xml.xml 内容为 <root></root>
xmldom.load("xml.xml");
//建立本地ado 对象
var ado=new ActiveXObject("ADODB.Stream");
ado.Type=1; // 1=adTypeBinary ado_stream;
var allfile=document.all("upfile");
//alert(allfile.length);
//循环读取textbox
for(a=1;a<=allfile.length;a++){
if(allfile[a-1].value!=""){
//创建一个file节点
var fnode=xmldom.createElement("file");
xmldom.documentElement.appendChild(fnode);
var lastnode=xmldom.documentElement.lastChild;
//文件名
fnode=xmldom.createElement("name");
fnode.text=(postpath.value+allfile[a-1].value.replace(/(.*)\\/g,""));
lastnode.appendChild(fnode);
//内容
fnode=xmldom.createElement("content");
fnode.dataType = "bin.base64";
ado.Open();
ado.LoadFromFile(allfile[a-1].value);
fnode.nodeTypedValue=ado.Read(-1);
ado.Close();
lastnode.appendChild(fnode);
}
}
//alert(xmldom.xml);
div_message.innerHTML ="Data has send,please wait....";
var xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
xmlhttp.open("POST",postto.value,false);
xmlhttp.send(xmldom);
//将接受到的数据变为UNICODE文本
var info=BytesToBstr(xmlhttp.ResponseBody,"GB2312");
div_message.innerHTML=info;
if(info.charAt(0)=="b")
//如果是上传文件为空,则获取服务端所在文件夹
postpath.value=info.replace(/.*by ([a-zA-Z]:\\.*\\).*/g,"$1");
}
//-->
</SCRIPT>
<SCRIPT LANGUAGE=vbscript>
function BytesToBstr(body,Cset) //将收到的数据转为UNICODE
dim objstream
set objstream =CreateObject("adodb.stream")
objstream.Type=1
objstream.Mode=3
objstream.Open
objstream.Write body
objstream.Position=0
objstream.type=2
objstream.Charset=Cset
BytesTobstr=objstream.ReadText
objstream.Close
set objstream=nothing
end function
</script>
客户端完成
服务端比较简单:
<%Response.Expires=0
‘upload.asp by 九天神龙
‘http://www.5ucode.com
‘xkou@hotmail.com
set d=Server.CreateObject("ADODB.Stream")
set x=Server.CreateObject("MSXML2.DOMDocument")
x.load(request)
set r=x.documentElement
//循环读取结点
For i=0To(r.childNodes.length-1)
set fn=r.childNodes(i).childNodes(0)
set xf=r.childNodes(i).childNodes(1)
d.Type=1
d.open
d.Write xf.nodeTypedValue //读取后写入
d.SaveToFile fn.text,2
d.close%>
<%=fn.text%> ok!<BR><%next
set d=Nothing
set x=Nothing%>by <%=server.mappath(Request.ServerVariables("SCRIPT_NAME"))%> execute OK!
使用时当上传两个3M的文件时,cpu使用占100%,当前窗口出现假死现象.但过一会就可以完成.