我正在开发 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/