internet-explorer - JScript/VBscript : Tracking file download progress via XMLHttpRequest

标签 internet-explorer xmlhttprequest javascript

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

The data necessary to complete this operation is not yet available.

因此,当 Microsoft 记录在 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;
    }
  }
}

最佳答案

您可以使用 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 永远不会触发。

关于internet-explorer - JScript/VBscript : Tracking file download progress via XMLHttpRequest,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1364530/

相关文章:

javascript - Angular 输入指令在 IE8 和 IE9 中无法按预期工作

javascript - 关于焦点,如何将插入符号放在 IE 中已填充字段中的最后一个字符后面?

用于 IE 的 Javascript textContent(保留空格的 innerText)

javascript - 在 iOS Safari 上打开文件/图像选择器时,现有异步请求因网络错误而失败

javascript - addEventListener Progress 未触发

javascript - 单击按钮刷新页面 div

javascript - 从对象中删除值而不发生突变

javascript - 如何在不使用 XDomainRequest 或 XMLHttpRequest 的情况下使用自定义 header 发出跨域请求?

java - Angular2 在使用 XMLHttpRequest 发帖时正在刷新页面

javascript - XMLHttpRequest、readyState 问题