[英]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.