JScript / VBscript:通过XMLHttpRequest跟踪文件下载进度

时间:2009-09-01 20:40:21

标签: internet-explorer xmlhttprequest javascript

我在JScript / VBScript HTML应用程序上工作(因此我们可以以比普通网页更高的权限执行),并且我们提供下载文件的功能,并且需要向我们的用户提供有关下载进度的反馈。当然,我根据总文件大小和已下载文件的数量计算了进度条或进度文本。我试图在Internet Explorer中获取已下载部分的大小。到目前为止,我已经尝试了所有我能想到的内容来访问已经下载了多少文件。在readyState 3(交互式)期间尝试访问responseText或responseBody时,我只是得到了异常:

  

尚未提供完成此操作所需的数据。

因此,当他们记录在XMLHttpRequest完成之前(即已进入readyState 4),responseText或responseBody将无法使用时,微软似乎没有撒谎。

我可以得到总文件大小并将文件保存到磁盘,所以我省略了我已经拥有的代码部分。这是我一直在尝试的。我愿意接受任何其他建议 - 甚至改变XMLHttpRequest的实现。请注意,我无法控制服务器端的东西...只有我的客户端应用程序,因此php / ASP解决方案将无法正常工作。 提前谢谢......

function getRemoteFile(urlToFile){
  if (urlToFile)    {
    try         {
      var xmlReq = new XMLHttpRequest();
      //Tried all of the following with no luck
    //var xmlReq = new ActiveXObject('Microsoft.XMLHTTP');
    //var xmlReq = new ActiveXObject('Msxml2.DOMDocument.3.0');
    //var xmlReq = new ActiveXObject("Msxml2.XMLHTTP.3.0");
    //var xmlReq = new ActiveXObject("Msxml2.XMLHTTP.6.0");
    //var xmlReq =new ActiveXObject("Msxml2.DOMDocument.6.0");

      function updateDownloadProgress() {                     
        if (xmlReq.readyState == 3) {
            try {
              alert(xmlReq.responseText.length);

            }
            catch (e) {
            alert(e.message);
            }          
          window.setTimeout(updateDownloadProgress, 200);
        }
      }                    

      xmlReq.open("GET", urlToFile, true);
      xmlReq.onreadystatechange = function(){
        if (xmlReq.readyState == 3)      {
          updateDownloadProgress();
        }
        if (xmlReq.readyState == 4)      {
          alert("done");
        }
      }
      xmlReq.send(null);
    } catch(e) {
      alert(e.message);
      return null;
    }
  }
}

4 个答案:

答案 0 :(得分:1)

您可以使用ondataavailable事件显示IE中的XML文档的下载进度:

var xmlDoc = new ActiveXObject("MSXML2.DOMDocument.3.0");
xmlDoc.ondataavailable = ondataavailable;
xmlDoc.async = true;
xmlDoc.load(url);

function ondataavailable() {
    ...
}

XML在完全加载之前变得可用。要显示进度,您需要在服务器端的第一个XML节点中放置节点数,并在新的XML到达时计算节点。

我知道这只对XML文档有帮助,而且您必须能够修改服务器xml添加节点数。但据我所知,这是以某种方式显示IE进展的唯一方法。

请注意,如果服务器返回非xml内容,则ondataavailable永远不会触发。

答案 1 :(得分:0)

检查下载进度时添加try / catch块。确保在服务器可用时刷新数据,某些服务器/服务器脚本将缓冲内容。

答案 2 :(得分:0)

我认为你不能直截了当地做到这一点,因为在收到所有内容之前,你不会在客户端获得进度更新(至少不是以整齐的跨浏览器方式)。但是,您可以在服务器端告诉您已将多少文件写入响应。因此,一种方法是通过第二次AJAX调用并行地为特定下载请求写入响应的数量。因此,为每个下载提供一个ID,通过此ID存储可查找的下载状态服务器端,并调用单独的并行AJAX请求来查询该ID的进度。然后以您想要的任何方式显示 - 进度条,显示完成百分比的标签等

有关readyState == 3周围问题的讨论,请参阅this post

答案 3 :(得分:0)

迟到总比没有......添加答案......

今天我发现,通过尝试你无法访问'Microsoft.XMLHTTP'的内容 - 并且很可能是所有其他XMLHTTP派生词 - 直到它被完全加载。

但是,您可以在加载时实时访问“internetExplorer.application”的内容。 但我想对于Web开发人员来说,这个目标并不灵活。