xh = new ActiveXObject("Microsoft.XMLHTTP");
function ObjDown$Save($ServerUrl,$LocalUrl){this.objStream = new ActiveXObject("ADODB.Stream");
this.strServer = $ServerUrl;
this.Local = $LocalUrl;this.GetFile = function(){
xh.onreadystatechange = this.GetReady;
xh.open("GET",this.strServer,true);
xh.send();
}this.GetReady = function(){
if(xh.readyState==4)
{
if(xh.status==200) 
{this.SetFile();return true;} 
else
{return false;}
}
else
{return false;}
}this.SetFile = function(){ 
var imgs = this.xh.responseBody;
this.objStream.Type = 1;
this.objStream.Open();
this.objStream.write(imgs);
this.objStream.SaveToFile(tofile,2);
this.objStream.Close();
}
}

解决方案 »

  1.   

    是这样的,
    我现在需要一次下载多的文件,单独用了上面几个函数发觉:
    下载一个文件很正常。
    但是如果下载多个文件:通常后面的代码比前面的代码执行的要快,
    主要是xh.send发送的太快了,以至通常后面的responseBody会代替前面的responseBody!
    而且用setTimeout也没什么用处。所以我想用类的方法将xmlhttp分开执行试试看,楼上的代码由于xh是全局变量,所以下载一个文件
    应该没有问题,但是下载多个文件就不对了,原理同上。有没有其他什么办法,能使多个文件类似多个线程执行的方法,彼此不要干扰,请教大家了,分数不够还可以加。
      

  2.   

    你报错的原因就是xh变量为局部变量,GetReady得不到xh的值,所以报对象为空
      

  3.   

    xh最好是全局的,xmlhttp是握手的,跟http有些不同,不会互相干扰的,建议你不要把发送请求、判断XmlHttp.status分开,放在一起
    ------------------------
    xh.onreadystatechange = this.GetReady;
    xh.open("GET",this.strServer,true);
    xh.send();if(xh.readyState==4)
    {
    if(xh.status==200) 
    {this.SetFile();return true;} 
    else
    {return false;}
    }
    else
    {return false;}
      

  4.   

    就是判断其status的函数和发送是写在一起吗?但是这样好象xh.readyState就是等于1啦,永远不等于4了
    onreadystatechange事件好象是等当status变化的时候触发,也就是send过程到获取数据
    不是定时的,是不知道时间的。而只有不停检验状态位,才可能拿到responseBody呀。诶,好郁闷呀,楼上的和楼上的楼上能不能还有好的方法解决
    小弟跪谢啦。
      

  5.   

    大家有什么使用xmlhttp批量下载文件的例子没有?
    我要学习学习,多谢
      

  6.   

    我查了一下请求发出去之后,在等待数据的过程中,好像只有服务器端有个 waitForResponse 方法:
    --------------------------------
    while (xmlServerHttp.readyState != 4) {
       xmlServerHttp.waitForResponse(1000);
    }客户端则没有这样一个方法,所以我估计这个状态是由xmlhttp针对每次请求自己维护的,你在客户端可不需检测readyState
      

  7.   

    我一htc,全部xmlhttp操作都由下面这个方法执行,页面装载的时候,先后多次调用;
    ----------------
    ... ...
    XmlHttp.Open( "POST", url, false )
    XmlHttp.setRequestHeader( "Content-Type","text/XML" )
    XmlHttp.Send( xml ) if (XmlHttp.status != 200 || XmlHttp.responseXML.xml == "")
    {
    showContent(XmlHttp.responseText)
    return false
    } switch (method)
    {
    case 'selectdata':
       XmlData.loadXML(XmlHttp.responseXML.xml);
       break;
    case 'selectoptions':
    case 'selectoptions2':
       if (XmlSelectData == null)
          XmlSelectData = new ActiveXObject("MSXML.DOMDocument")    XmlSelectData.loadXML(XmlHttp.responseXML.xml);
       break;
    default:
       XmlDoc.loadXML(XmlHttp.responseXML.xml);
    } return true
    ... ...
      

  8.   

    多谢你的代码,呵呵,就因为看见你的open参数不同,我才去找相关资料
    发觉:
    我用的是异步方式XmlHttp.Open( "GET", url, true )
    其实需要的是同步方式方式去获得就可以啦XmlHttp.Open("GET",url,false)解释如下:
    async 一个布尔标识,说明请求是否为异步的。如果是异步通信方式(true),客户机就不等待服务器的响应;如果是同步方式(false),客户机就要等到服务器返回消息后才去执行其他操作 多谢了,呵呵