簡體   English   中英

JScript / VBscript:通過XMLHttpRequest跟蹤文件下載進度

[英]JScript/VBscript: Tracking file download progress via XMLHttpRequest

我正在使用JScript / VBScript HTML應用程序(因此我們可以以比普通網頁更高的特權執行),並且我們提供下載文件的功能,並且需要向用戶提供有關下載進度的反饋。 自然地,我根據文件的總大小和已下載的文件數量來確定進度條或進度文本。 我正在嘗試獲取Internet Explorer中已經下載的部分的大小。 到目前為止,我已經嘗試了所有可以想到的方法來訪問已經下載了多少文件。 當嘗試在readyState 3(交互)期間訪問responseText或responseBody時,我僅得到異常:

完成此操作所需的數據尚不可用。

因此,當他們證明在XMLHttpRequest完成之前,responseText或responseBody將不可用時,Microsoft似乎並沒有撒謊(已變為readyState 4)

我可以得到文件的總大小並將文件保存到磁盤,因此省略了我已有的代碼部分。 這是我一直在嘗試的方法。 我願意接受任何其他建議-甚至將實現從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不會觸發。

當您檢查下載進度時,請添加一個try / catch塊。 確保從服務器可用時刷新數據,某些服務器/服務器腳本將緩沖內容。

我認為您不能直接做到這一點,因為在所有內容都收到之前,您不會在客戶端(至少不是以一種簡潔的跨瀏覽器方式)獲得進度更新。 但是,您可以在服務器端知道已寫入響應中的文件數量。 因此,一種方法是通過第二個AJAX調用,使針對特定下載請求的寫入響應的數量並行可用。 因此,給每個下載一個ID,存儲在該ID可以找到的下載狀態服務器端,並調用單獨的並行AJAX請求以查詢該ID的進度。 然后以您想要的任何方式顯示它-進度條,顯示完成百分比的標簽等。

請參閱此帖子 ,以討論關於readyState == 3的問題。

遲到總比沒有好...添加答案...

今天,我試圖通過嘗試在完全加載之前無法訪問“ Microsoft.XMLHTTP”的內容以及大多數其他XMLHTTP派生類的內容。

但是,可以在加載“ internetExplorer.application”的內容時實時訪問它。 但是我想對於Web開發人員來說,這個對象並不那么靈活。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM