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

希望能帮助到你~

相关推荐
小二·3 分钟前
Python Web 开发进阶实战:量子机器学习实验平台 —— 在 Flask + Vue 中集成 Qiskit 构建混合量子-经典 AI 应用
前端·人工智能·python
TTGGGFF8 分钟前
控制系统建模仿真(十):实战篇——从工具掌握到工程化落地
前端·javascript·ajax
郝学胜-神的一滴30 分钟前
深入解析C/S架构与B/S架构:技术选型与应用实践
c语言·开发语言·前端·javascript·程序人生·架构
这是个栗子1 小时前
前端开发中的常用工具函数(二)(持续更新中...)
开发语言·前端·javascript
苦藤新鸡1 小时前
38.交换二叉树中所有的左右节点
开发语言·前端·javascript
2501_944521592 小时前
Flutter for OpenHarmony 微动漫App实战:主题配置实现
android·开发语言·前端·javascript·flutter·ecmascript
lina_mua2 小时前
Cursor模型选择完全指南:为前端开发找到最佳AI助手
java·前端·人工智能·编辑器·visual studio
董世昌412 小时前
null和undefined的区别是什么?
java·前端·javascript
软弹2 小时前
Vue2 的数据响应式原理&&给实例新增响应式属性
前端·javascript·vue.js
浅水壁虎2 小时前
任务调度——XXLJOB3(执行器)
java·服务器·前端·spring boot