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等等,经过实验,以上方法就可以简便实现功能。

希望能帮助到你~

相关推荐
Dovis(誓平步青云)11 分钟前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan43 分钟前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_1 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒2 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技2 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
星光开发者2 小时前
基于决策树随机森林算法的小说推荐系统的设计与实现-计算机毕设【课程设计】78485
vue.js·算法·微信小程序·django·php·课程设计·express
yivifu2 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub
vx_Biye_Design3 小时前
springboot高校选课系统82776-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·spring·课程设计·express
niyongsheng3 小时前
后端零改动,给若依换一套现代化前端
vue.js·开源·node.js
默_笙3 小时前
🛴 从散件到整机:DeepAgents 与 Agent 身上预留的那些"插槽"(前置介绍)
前端·javascript