• 首页
  • 小学语文
  • 中学语文
  • 中学英语
  • 免费论文
  • 教学随笔
  • 学生作文
  • 综合考试
  • 试题教案
  • 育儿话题
  • 教学资源
  • 编程技术
  • 博客
  • 使用xmlhttp 实现多文件上传

    日期:2004-12-16  地址:  作者:
     

    如今xml技术渐渐成熟,成为了一种网站传播数据的又一种方式,下面是我用xmlhttp写的一个多文件上传程序.包括客户端和服务端两部分..

    本程序的实现是利用xml可以在其结点存放经base64编码的二进制文件,先在客户端生成包含要传文件的xml ,通过xmlhttp发送到服务端.下面是客户端:

    <html>

    <!--

    xmlupload.htm by 九天神龙

    http://www.5ucode.com

    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"> &nbsp;<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%,当前窗口出现假死现象.但过一会就可以完成.

    对 使用xmlhttp 实现多文件上传 文章的评论    [查看网友评论]

    验证码:
    匿名发表: