vue+axios+el-progress(elementUI组件)实现下载进度条实时监听(小白简洁版)

一、实现效果

二、实现方式

方案:使用axios方法onDownloadProgress方法监听下载进度

使用此方式的前提 !!!请让后端在响应头中加上content-length,存放下载文件的总大小,如下图:

三、代码


1、进度条页面代码如下:

xml 复制代码
 <Spin fix v-if="spinVisible">
     <Icon type="ios-loading" size=18 class="demo-spin-icon-load"></Icon>
     <div>正在下载代码,请稍后...</div>
     <el-progress :percentage="percentComplete"></el-progress>
 </Spin>
 ps:我的进度条是在iview组件spin加载页里的,若你不需要,可只粘贴el-progress组件部分

2、点击下载按钮的js方法逻辑部分

Axios中,onDownloadProgress是一个回调函数,它作为参数传递给axios方法。当axios开始接收响应数据时,会定期触发该回调函数,以提供下载进度信息。

onDownloadProgress回调函数的参数包含以下信息:

  • lengthComputable:一个布尔值,指示是否可以根据已接收的字节数和总字节数计算出下载进度百分比。
  • loaded:一个表示已接收字节数的整数,表示当前已下载的字节数。
  • total:一个表示总字节数的整数,表示要下载的文件的总字节数。如果lengthComputable为false,那么total的值将为0。
typescript 复制代码
// 点击下载代码的方法
 downloadCode(id) {
      // 定义全局变量percentComplete 为下载进度值(定义data此处忽略)
     this.percentComplete = 0
     // axios调用下载接口,timeout可删掉,我这里是因为文件太大想延长请求时间
     axios({method: 'post',url: 'xxxx',data: xxx, 
        headers: { 'Authorization': Cookies.get('token') }, responseType: 'blob', timeout: 600000,                         
        // withCredentials: true,可配可不配,根据项目实际情况选择
        // 使用此方法监听
         onDownloadProgress:  (e) => {
             console.log('e:',e);
             // e是一个包含下载进度信息的事件对象,其中包括loaded 、total属性:
             this.percentComplete = Math.floor((e.loaded / e.total) * 100)
         } })
         .then((res) => {
             const blob = new Blob([res.data], {type: 'application/octet-stream'}); //处理文档流
             const fileName = res.headers['content-disposition'].split('filename=')[1];
             const elink = document.createElement("a");
             elink.download = fileName;
             elink.style.display = "none";
             elink.href = URL.createObjectURL(blob);
             document.body.appendChild(elink);
             elink.click();
             URL.revokeObjectURL(elink.href); // 释放URL 对象
             document.body.removeChild(elink);
         }).finally(() => {
             this.spinVisible = false
         });
 },

以上,便可以实现一个下载进度条监听的功能,

其实还是踩了很多坑的,什么XHR等等,经过实验,以上方法就可以简便实现功能。

希望能帮助到你~

相关推荐
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅7 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅8 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment8 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅8 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊8 小时前
jwt介绍
前端
爱敲代码的小鱼8 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax