广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >Vue文件下载进度条的实现过程
  • 336
分享到

Vue文件下载进度条的实现过程

2024-04-02 19:04:59 336人浏览 独家记忆
摘要

目录需求场景:实现原理:优化过程:下载方法的组件引入mixinVuex配置进度条最终效果图参考文章:需求场景: 1、大文件压缩过后依旧很大,接口返回response速度过慢,页面没有

需求场景:

1、大文件压缩过后依旧很大,接口返回response速度过慢,页面没有任何显示,体验太差。

2、需要在浏览器显示正在加载中的状态优化显示,提高用户体验

实现原理:

1、使用onDownloadProgress方法api获取进度及文件大小等数据

2、mixin混入实现监听进度条进度

3、vuex修改进度条进度

优化过程:

使用onDownloadProgress封装一个下载文件的方法

downFileProgress: function (url, params, headers, blenderApiUrl, callback, uniSign) {
   return axiOS({
     url: url,
     params: params,
     method: 'get',
     responseType: 'blob',
     baseURL: blenderApiUrl,
     headers: headers,
     onDownloadProgress (progress) {
       callback(progress, uniSign)
     }
   })
 }

在下载文件的地方,使用封装的方法downFileProgress

downOrgFile (row) {
  let uniSign = `${new Date().getTime()} ` // 可能会连续点击下载多个文件,这里用时间戳来区分每一次下载的文件
  const url = `${this.$api.LifeInsuranceScenario2DownFile}/${row.account_name}/${row.task_id}`
  const baseUrl = this.iframeData.blenderApiUrl
  this.$Http.downFileProgress(url, {}, this.headers, baseUrl, this.callBackProgress, uniSign).then(res => {
    if (!res) {
      this.$sweetAlert.errorWithTimer('文件下载失败!')
      return
    }
    if (typeof window.navigator.msSaveBlob !== 'undefined') {
      window.navigator.msSaveBlob(new Blob([res.data]), '中间项下载.zip')
    } else {
      let url = window.URL.createObjectURL(new Blob([res.data]))
      let link = document.createElement('a')
      link.style.display = 'none'
      link.href = url
      link.setAttribute('download', 'xxx.zip')
      document.body.appendChild(link)
      link.click()
      link.remove()
    }
  })
},
callBackProgress (progress, uniSign) {
  let total = progress.srcElement.getResponseHeader('Real-Content-Length')
  // progress对象中的loaded表示已经下载的数量,total表示总数量,这里计算出百分比
  let downProgress = Math.floor((progress.loaded / total) * 100)
  // 将此次下载的文件名和下载进度组成对象再用vuex状态管理
  this.$store.commit('SET_PROGRESS', { path: uniSign, progress: downProgress })
}

创建component同等级mixin文件夹,文件夹创建index.js

import { mapState } from 'vuex'
export const mixins = {
  computed: {
    ...mapState({
      progressList: state => state.progressList
    })
  },
  data () {
    return {
      notify: {} // 用来维护下载文件进度弹框对象
    }
  },
  watch: {
    // 监听进度列表
    progressList: {
      handler (n) {
        let data = JSON.parse(JSON.stringify(n))
        data.forEach(item => {
          const domList = [...document.getElementsByClassName(item.path)]
          if (domList.find(i => i.className === item.path)) {
            // 如果页面已经有该进度对象的弹框,则更新它的进度progress
            if (item.progress) domList.find(i => i.className === item.path).innerhtml = item.progress + '%'
            if (item.progress === null) {
              // 此处容错处理,如果后端传输文件流报错,删除当前进度对象
              this.$store.commit('DEL_PROGRESS', item.path)
              this.$notify.error({ title: '错误', message: '文件下载失败!' })
            }
          } else {
            // 如果页面中没有该进度对象所对应的弹框,页面新建弹框,并在notify中加入该弹框对象,属性名为该进度对象的path(上文可知path是唯一的),属性值为$notify(element ui中的通知组件)弹框对象
            this.notify[item.path] = this.$notify.success({
              dangerouslyUseHTMLString: true,
              customClass: 'progress-notify',
              message: `<p style="width: 150px;line-height: 13px;">中间项正在下载<span class="${item.path}" style="float: right">${item.progress}%</span></p>`, // 显示下载百分比,类名为进度对象的path(便于后面更新进度百分比)
              showClose: true,
              duration: 0
            })
          }
          if (item.progress === 100) {
            // 如果下载进度到了100%,关闭该弹框,并删除notify中维护的弹框对象
            // this.notify[item.path].close()
            // 上面的close()事件是异步的,直接delete this.notify[item.path]会报错,利用setTimeout,将该操作加入异步队列
            setTimeout(() => {
              delete this.notify[item.path]
            }, 1000)
            this.$store.commit('DEL_PROGRESS', item.path) // 删除caseInfORMation中state的progressList中的进度对象
          }
        })
      },
      deep: true
    }
  }
}

下载方法的组件引入mixin

import { mixins } from '../mixin/index'
export default {
  mixins: [mixins],
  ......
}

Vuex配置进度条

const state = {
  progressList: []
}
export default state
const mutations = {
  SET_PROGRESS: (state, progressObj) => {
    // 修改进度列表
    if (state.progressList.length) {
      // 如果进度列表存在
      if (state.progressList.find(item => item.path === progressObj.path)) {
        // 前面说的path时间戳是唯一存在的,所以如果在进度列表中找到当前的进度对象
        state.progressList.find(item => item.path === progressObj.path).progress = progressObj.progress
        // 改变当前进度对象的progress
      }
    } else {
      // 当前进度列表为空,没有下载任务,直接将该进度对象添加到进度数组内
      state.progressList.push(progressObj)
    }
  },
  DEL_PROGRESS: (state, props) => {
    state.progressList.splice(state.progressList.findIndex(item => item.path === props), 1) // 删除进度列表中的进度对象
  },
  CHANGE_SETTING: (state, { key, value }) => {
    // eslint-disable-next-line no-prototype-builtins
    if (state.hasOwnProperty(key)) {
      state[key] = value
    }
  }
}

export default mutations
export const getProgressList = state => state.progressList
export const changeSetting = function ({ commit }, data) {
  commit('CHANGE_SETTING', data)
}
export const setprogress = function ({ commit }, data) {
  commit('SET_PROGRESS', data)
}
export const delprogress = function ({ commit }, data) {
  commit('DEL_PROGRESS', data)
}

最终效果图

参考文章:

juejin.cn/post/702437…

到此这篇关于Vue文件下载进度条的实现过程的文章就介绍到这了,更多相关Vue下载进度条内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Vue文件下载进度条的实现过程

本文链接: https://www.lsjlt.com/news/153460.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Vue文件下载进度条的实现过程
    目录需求场景:实现原理:优化过程:下载方法的组件引入mixinVuex配置进度条最终效果图参考文章:需求场景: 1、大文件压缩过后依旧很大,接口返回response速度过慢,页面没有...
    99+
    2022-11-13
  • React和Vue实现文件下载进度条
    目录一、需求场景二、实现原理三、react 实现步骤1. 托管静态资源2. 封装hook3. 使用hook四、vue 实现步骤1. 托管静态资源2. 封装hook3. 使用hook五...
    99+
    2023-05-18
    React下载进度条 Vue下载进度条
  • vue项目实现文件下载进度条功能
    平时业务中下载文件方式常见的有俩种: 第一种,直接访问服务器的文件地址,自动下载文件; 第二种 ,服务器返回blob文件流,再对文件流进行处理和下载。 一般小文件适用于第一种下载方案...
    99+
    2022-11-12
  • Android文件下载进度条的实现代码
    main.xml: 代码如下:<xml version="1.0" encoding="utf-8"><LinearLayout xmlns:android=...
    99+
    2022-06-06
    进度条 Android
  • python下载文件带进度条怎么实现
    要实现带进度条的文件下载,可以使用`urllib.request`模块和`tqdm`库。以下是一个示例代码:```pythonimp...
    99+
    2023-09-26
    python
  • vue+element+springboot实现文件下载进度条展现功能示例
    目录1. 需求背景2. 优化方案3. 具体实现3.1 前端代码3.2 后台代码4. 总结本文主要介绍了vue+element+springboot实现文件下载进度条展现功能示例,分享...
    99+
    2022-11-12
  • android中实现OkHttp下载文件并带进度条
    OkHttp是比较火的网络框架,它支持同步与异步请求,支持缓存,可以拦截,更方便下载大文件与上传文件的操作。下面我们用OkHttp来下载文件并带进度条!相关资料: 官网地址:http://square.github.io/okhttp/gi...
    99+
    2023-05-30
    okhttp 下载 文件
  • vue实现实时上传文件进度条
    本文实例为大家分享了vue实时上传文件进度条,供大家参考,具体内容如下 //上传文件组件 <el-upload         action         :show-fi...
    99+
    2022-11-13
  • 利用Python展示文件下载进度条
    目录1、前言2、requests3、思考1、前言 大家在用Python写一些小程序的时候,经常都会用到文件下载,对于一些较小的文件,大家可能不太在乎文件的下载进度,因为一会就下载完毕...
    99+
    2022-11-12
  • php怎么实现下载进度条
    本篇内容主要讲解“php怎么实现下载进度条”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“php怎么实现下载进度条”吧!php实现下载进度条的方法:1、创建“download.php”文件,代码如...
    99+
    2023-06-25
  • php如何实现下载进度条
    本文操作环境:Windows7系统、PHP7.1版、DELL G3电脑php如何实现下载进度条?PHP 远程文件下载的进度条实现download.php<php // 当前文件:download.php $action = @$_G...
    99+
    2022-03-06
    php
  • Android实现下载进度条效果
    目录最终效果和对比vivo商店效果分析1 - 计算进度分析2 - 绘制圆角矩形解决方案分析3 - 绘制文字和交汇手势拓展完整代码具体使用最终效果和对比vivo商店效果 vivo应用商...
    99+
    2022-11-12
  • Handler实现线程之间的通信下载文件动态更新进度条
    1. 原理每一个线程对应一个消息队列MessageQueue,实现线程之间的通信,可通过Handler对象将数据装进Message中,再将消息加入消息队列,而后线程会依次处理消息队列中的消息。2. Message初始化:一般使用Messag...
    99+
    2023-05-30
    android handler
  • 怎么用Python展示文件下载进度条
    这篇文章主要介绍“怎么用Python展示文件下载进度条”,在日常操作中,相信很多人在怎么用Python展示文件下载进度条问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么用Python展示文件下载进度条”的疑...
    99+
    2023-06-25
  • SpringBoot实现文件上传下载实时进度条功能(附源码)
    目录0. 引言1. 思路2. 实操2.1 实现文件上传实时进度条功能2.2 实现文件下载实时进度条功能3. 项目源码4. 总结0. 引言 记得刚入行的时候,做了一个文件上传的功能,因...
    99+
    2022-11-13
    SpringBoot文件上传下载实时进度条 SpringBoot 实时进度条 SpringBoot 进度条
  • 微信小程序怎样实现下载进度条
    这篇文章主要介绍了微信小程序怎样实现下载进度条,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。效果:progress进度条是微信小程序的组件,...
    99+
    2022-10-19
  • vue如何实现实时上传文件进度条
    这篇文章主要介绍了vue如何实现实时上传文件进度条,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。具体内容如下//上传文件组件<el-upload  ...
    99+
    2023-06-29
  • Android实现Service下载文件,Notification显示下载进度的示例
    先放个gif。。最终效果如果: 主要演示了Android从服务器下载文件,调用Notification显示下载进度,并且在下载完毕以后点击通知会跳转到安装APK的界面,演...
    99+
    2022-06-06
    service 示例 notification Android
  • vue实现zip文件下载
    本文实例为大家分享了vue实现zip文件下载的具体代码,供大家参考,具体内容如下 el-button按钮 <el-button size="mini" type="succ...
    99+
    2022-11-12
  • SpringMVC实现文件上传下载的全过程
    目录前言一、通用配置二、实现文件下载,上传功能总结前言 文件的上传和下载都是基于io复制,只不过 文件上传是浏览器向服务器发送报文 文件下载是服务器向浏览器发送报文 提示:以下是本篇...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作