XMLHttpRequest 对象实现下载文件,并且实时显示进度条(兼容ie,chrome,Firefox)

本文介绍如何使用XMLHttpRequest对象实现文件下载功能,包括实时显示下载进度,兼容多种浏览器(如Chrome、Firefox、IE)。通过示例代码展示了下载过程中的事件监听,如开始、成功、失败、中断及结束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

XMLHttpRequest 应用,实现下载文件,并且实时显示进度条(兼容ie,chrome,Firefox)


有关XMLHttpRequest对象的详细信息可以参照 xmlHttpRequest web API 接口文档: https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest.

最近做项目关于下载方面的功能采用了XMLHttpRequest 对象来进行开发。下面是具体的开发代码。

获取浏览器类型

开发项目中可能会对浏览器进行限制,所以增加了一个获取浏览器类型的方法,该文档中的下载功能只针对火狐浏览器,ie浏览器和谷歌浏览器。

// 获取浏览器类型
getBrowser:function() {
   var userAgent = window.navigator.userAgent; //取得浏览器的userAgent字符串
   var isOpera = userAgent.indexOf("Opera") > -1; //判断是否Opera浏览器
   var isIE = !!window.ActiveXObject || "ActiveXObject" in window; //判断是否IE浏览器
   var isEdge = userAgent.indexOf("Edge") > -1; //判断是否IE的Edge浏览器
   var isFF = userAgent.indexOf("Firefox") > -1; //判断是否Firefox浏览器
   var isSafari = userAgent.indexOf("Safari") > -1
        && userAgent.indexOf("Chrome") == -1; //判断是否Safari浏览器
   var isChrome = userAgent.indexOf("Chrome") > -1
        && userAgent.indexOf("Safari") > -1; //判断Chrome浏览器
   if (isIE) {
       return "IE";
   }
   if (isOpera) {
   	   return "Opera";
   }
   if (isEdge) {
       return "Edge";
   }
   if (isFF) {
       return "Firefox";
   }
   if (isSafari) {
      return "Safari";
   }
   if (isChrome) {
       return "Chrome";
   }
}
进行下载处理

xmlRequest 是在data中定义的 xmlRequest:new XMLHttpRequest(),progress也是在data中定义的

// path 指文件下载的路径,fileName 指文件下载保存的名称
// xmlRequest 也是在data中定义的 xmlRequest:new XMLHttpRequest()
download:function(path, fileName) {
   this.xmlRequest.open('get', path, true);
   this.xmlRequest.responseType = "blob";//这里是关键,它指明返回的数据的类型是二进制
   this.xmlRequest.addEventListener('progress',function(evt){
       var percent = evt.loaded / evt.total;
   	   this.progress=parseInt(percent*100);//progress 在data中定义的全局变量,显示的进度
   });
   //下载成功触发的事件
   this.xmlRequest.addEventListener('load',function (ev) {
   		let self = this;
        this.handleDown(fileName,self );
   });
   //下载结束触发的事件(无论下载成功失败,还是中断都得执行loadend)
   this.xmlRequest.addEventListener('loadend',function (ev) {
        this.loadend();
   });
   //下载失败触发的事件
   this.xmlRequest.addEventListener('error',function (ev) {
   	    this.error();
   });
   //下载中断触发的事件
   this.xmlRequest.addEventListener("abort", function(ev) {
        this.abort();
   });
   try{
       this.xmlRequest.send(null);
   }catch(e) {
       this.$message.error('请检查网络是否正常!');
       return;
   };
},
下载成功的方法
// An highlighted block
handleDown:function(fileName,vueObj){
            //下载完成事件:处理下载文件
    if (vueObj.xmlRequest.readyState === 4 && vueObj.xmlRequest.status === 200) {
        var b = vueObj.getBrowser();
        //判断浏览器类型
        if (b == "Chrome"){
            var link = document.createElement('a');
            link.href = window.URL.createObjectURL(vueObj.xmlRequest.response);
            link.download = fileName;
            link.click();
            vueObj.progress = 0;
        }else if (b == "Firefox"){
            var file = new File([vueObj.xmlRequest.response],fileName,{type:'application/octet-stream'});
            var url = URL.createObjectURL(file);
            parent.location.href = url;
            vueObj.progress = 0;
       }else if (b == "IE"){
            var file = new Blob([vueObj.xmlRequest.response], { type:'application/force-download' });
            window.navigator.msSaveOrOpenBlob(file, fileName);
            vueObj.progress = 0;
       }
   }else{
       vueObj.$message.error('请检查网络是否正常!');
       vueObj.xmlRequest = new XMLHttpRequest();
       return;
   }
   vueObj.$message.success('下载成功!');
   return;
}
下载失败的方法
// An highlighted block
error:function(){
    this.progress = 0;
    this.xmlRequest = new XMLHttpRequest();
    this.$message.error('下载出错');
}
下载中断的方法
// An highlighted block
abort:function(){
    this.progress = 0;
    this.xmlRequest = new XMLHttpRequest();
}
下载结束的方法
// An highlighted block
loadend:function(){
    this.progress = 0;
    this.xmlRequest = new XMLHttpRequest();
}

以上就是关于XMLHttpRequest 对象下载的js代码,HTML页面代码没有放出来,具体的操作可以根据自身的需要做更改。在使用XMLHttpRequest 对象下载结束后一定要重新初始化一下,否则会出现多次下载的现象。(即:this.xmlRequest = new XMLHttpRequest();)

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值