xmlhttp上传文件(转贴)
| |||
如今xml技术渐渐成熟,成为了一种网站传播数据的又一种方式,下面是我用xmlhttp写的一个多文件上传程序.包括客户端和服务端两部分.. 本程序的实现是利用xml可以在其结点存放经base64编码的二进制文件,先在客户端生成包含要传文件的xml 再,通过xmlhttp发送到服务端.下面是客户端: <html> <!-- xmlupload.htm by 九天神龙 xkou@hotmail.com //--> < <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%,当前窗口出现假死现象.但过一会就可以完成. |