vue下载文件时显示进度条

vue+axios+el-progress(elementUI组件)实现下载进度条实时监听(小白简洁版) 其实还是踩了很多坑的,什么XHR等等,经过实验,以上方法就可以简便实现功能。开始接收响应数据时,会定期触发该回调函数,以提供下载进度信息。以上,便可以实现一个下载进度条监听的功能,是一个回调函数,它作为参数传递给。请让后端在响应头中加上。 阅读详情
AI摘要

本文介绍了如何在Vue应用中实现单个和批量文件下载功能,包括使用el-button显示下载按钮或进度条,利用axios进行文件下载,以及处理下载进度和批量导出时的进度显示。同时提及了深拷贝方法和Blob对象的使用。

1.单个下载(开始是导出按钮 下载显示进度条)

html

 <el-button @click.stop="exportReport(scope.row, scope.index)" 
    v-if="!scope.row.schedule" icon="el-icon-download"
     size="small" type="text"style="color: #409eff">导出报告
 </el-button>
 <el-progress style="width: 60px;display:inline-block;margin-left: 20px;" 
      v-else :text-inside="true" :stroke-width="20" 
       :percentage="scope.row.scheduleNumber" status="success" />

 因为接口没有返回schedule和scheduleNumber数据只是前端需要 用来判断显示 按钮还是进度条的所以就手动给数组添加响应式数据

     this.data.map((item, index) => {
        this.$set(item, 'schedule', false);
        this.$set(item, 'scheduleNumber', 0);
        return item;
      });

js部分

  exportReport(row) {
      let data=this.visible?this.selectionList:this.data
    // 自己封装的方法
      downloadGet('/api/blade-robot/siteInfo/export-template','巡检报告', this.schedule, row).then(() => {
        data.forEach((x) => {
          if (x.id === row.id) {
            x.schedule = false
          }
        })
      })
    },
    schedule(progressEvent, row) {
    // 回调的progressEvent参数里有一个progressEvent.loaded和progressEvent.total两个参数,分别意思为已下载的文件大小和总文件大小
    // 因为total一直为0,经研究发现需要后端传给我ContentLength到response里这个值才会有值
    // 然而又发现后端使用的是minio这个文件服务器,所以这个文件大小太难获取了,所以我决定不改后端,直接写死了文件大小
    setTimeout(() => {
      let data=this.visible?this.selectionList:this.data
      data.forEach((x) => {
        if (x.id === row.id) {
            x.schedule = true
            x.scheduleNumber = Math.round(progressEvent.loaded / 3715 * 100)
            if( x.schedule == true){
              setTimeout(() => {
                 x.schedule = false
              }, 2000);
            }
        }
      })
    }, 2000);
    },

 downloadGet方法

export const downloadGet = (url, filename, callback, callbackParameter)=> {
  return request({
    url:url, 
    method: 'get',
    responseType: 'blob',
    timeout: 120000,
    // 下载的实时回调,axios里的
    onDownloadProgress: (a) => {
      if (callback) {
        callback(a, callbackParameter)
      }
    }
  }).then((r) => {
  // 下面的代码就是拿到字节流后转为文件的方法,想研究的可以自行百度
    const content = r.data
    const blob = new Blob([content],{type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'})
    if ('download' in document.createElement('a')) {
      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)
      document.body.removeChild(elink)
    }else if (typeof window.navigator.msSaveBlob !== 'undefined'){
       // IE
       let blob = new Blob([content], {type: 'application/force-download'});
      navigator.msSaveBlob(blob, filename)
    }else {
      // Firefox
      var file = new File([content], filename, {type: 'application/force-download'});
      window.open(URL.createObjectURL(file));
    }
  }).catch((r) => {
    console.error(r)
  })
}

以上就可以实现每行下载时候去显示进度条了

2.批量下载弹框

 

弹框html

<el-dialog title="批量导出巡检报告" @close="toClose"
 :close-on-click-modal="false" :visible="visible" lock-scroll append-to-body
  width="600px" :modal-append-to-body="false">
    <el-table :data="selectionList" border style="width: 100%">
    <el-table-column type="index"label="序号" width="50"></el-table-column>
    <el-table-column prop="id" label="文件名称">
      <template slot-scope="scope">
       <span>{{scope.row.id}}巡检报告</span>
      </template>
    </el-table-column>
    <el-table-column prop="scheduleNumber" label="下载进度">
      <template slot-scope="scope">
        <el-progress :percentage="scope.row.scheduleNumber"  :text-inside="true" :stroke-            
         width="20"  status="success"></el-progress>
      </template>
    </el-table-column>
  </el-table>
</el-dialog>

js

    import { deepClone } from "@/util/util";//引入深拷贝方法
    //表格选中多个
    selectionChange(list) {
      this.selectionList = deepClone(list);
    },
    //点击批量下载方法
    handleDelete() {
      if (this.selectionList.length === 0) {
          this.$message.warning("请选择至少一条数据");
          return;
      }
      this.$confirm("确定将选择数据批量导出巡检报告?", {
          confirmButtonText: "确定",
          cancelButtonText: "取消",
          type: "warning"
      })
      .then(() => {
        this.$nextTick(() => {
          this.visible=true
          this.selectionList.forEach(item=>{
          this.exportReport(item)
        })
        });
      })
      .catch(() => {});
      },
    //关闭弹框清空选中状态
     toClose(){
      this.visible=false
      this.onLoad(this.page);
      this.$refs.crud.toggleSelection();
    },
  

深拷贝方法(不使用深拷贝的话弹框和表格进度条会冲突!!!!!)

/**
 * 对象深拷贝
 */
export const deepClone = data => {
  var type = getObjType(data)
  var obj
  if (type === 'array') {
    obj = []
  } else if (type === 'object') {
    obj = {}
  } else {
    //不再具有下一层次
    return data
  }
  if (type === 'array') {
    for (var i = 0, len = data.length; i < len; i++) {
      obj.push(deepClone(data[i]))
    }
  } else if (type === 'object') {
    for (var key in data) {
      obj[key] = deepClone(data[key])
    }
  }
  return obj
}

 最后就是设置导出文件的类型在上文封装下载方法中 type设置的

const blob = new Blob([content],{type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'})

关于 Blob 的 content-type 的部分媒体类型 可以参照下面!!!!!

".*"="application/octet-stream"
".001"="application/x-001"
".301"="application/x-301"
".323"="text/h323"
".906"="application/x-906"
".907"="drawing/907"
".a11"="application/x-a11"
".acp"="audio/x-mei-aac"
".ai"="application/postscript"
".aif"="audio/aiff"
".aifc"="audio/aiff"
".aiff"="audio/aiff"
".anv"="application/x-anv"
".asa"="text/asa"
".asf"="video/x-ms-asf"
".asp"="text/asp"
".asx"="video/x-ms-asf"
".au"="audio/basic"
".avi"="video/avi"
".awf"="application/vnd.adobe.workflow"
".biz"="text/xml"
".bmp"="application/x-bmp"
".bot"="application/x-bot"
".c4t"="application/x-c4t"
".c90"="application/x-c90"
".cal"="application/x-cals"
".cat"="application/vnd.ms-pki.seccat"
".cdf"="application/x-netcdf"
".cdr"="application/x-cdr"
".cel"="application/x-cel"
".cer"="application/x-x509-ca-cert"
".cg4"="application/x-g4"
".cgm"="application/x-cgm"
".cit"="application/x-cit"
 
".doc"="application/msword"
".docx"="application/vnd.openxmlformats-officedocument.wordprocessingml.document"
".rtf"="application/rtf"
".xls"="application/vnd.ms-excel application/x-excel"
".xlsx"="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
".ppt"="application/vnd.ms-powerpoint"
".pptx"="application/vnd.openxmlformats-officedocument.presentationml.presentation"
".pps"="application/vnd.ms-powerpoint"
".ppsx"="application/vnd.openxmlformats-officedocument.presentationml.slideshow"
".pdf"="application/pdf"
".swf"="application/x-shockwave-flash"
".dll"="application/x-msdownload"
".exe"="application/octet-stream"
".msi"="application/octet-stream"
".chm"="application/octet-stream"
".cab"="application/octet-stream"
".ocx"="application/octet-stream"
".rar"="application/octet-stream"
".tar"="application/x-tar"
".tgz"="application/x-compressed"
".zip"="application/x-zip-compressed"
".z"="application/x-compress"
".wav"="audio/wav"
".wma"="audio/x-ms-wma"
".wmv"="video/x-ms-wmv"
".mp3, .mp2, .mpe, .mpeg, .mpg"="audio/mpeg"
".rm"="application/vnd.rn-realmedia"
".mid, .midi, .rmi"="audio/mid"
".bmp"="image/bmp"
".gif"="image/gif"
".png"="image/png"
".tif, .tiff"="image/tiff"
".jpe, .jpeg, .jpg"="image/jpeg"
".txt"="text/plain"
".xml"="text/xml"
".html"="text/html"
".css"="text/css"
".js"="text/javascript"
".mht, .mhtml"="message/rfc822"

大概率就OK了!!!!!等待大文件联调看效果!!!!!!(其中的延时器是因为我现在测试的文件只有4kb没有进度条效果 所以出此下策 请辨别哦~~~~) 

 

 

 

Vue实现带进度条的文件拖动上传 https://math-digital.cn/blog/3 阅读详情

相关推荐

vue 实现实时获取大文件下载进度

vue 实现实时获取大文件下载进度

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2493

Vue实现文件下载进度显示

【代码】Vue实现文件下载进度显示。

到底要什么姿态,才不会显得我在使坏。 3321

文件下载带进度条的哦很实用

文件下载带进度条的哦很实用

vue实现下载文件百分比实时显示效果

工作中经常会遇到下载文件的需求,如果一般的大小还可以很快的下载下来,但是如果报表类的文件,一般都会比较大,这时候就会等很久才可以下载完成,但是用户可能并不知道目前下载的情况,可能会以为没有下载成功,频繁点击,所以网上搜索了一下,整理了目前比较常用的显示下载进度的方式,目前是使用VUE+elementUi+Axios 实现的。这个是我公司的下载接口,可以看到已经是很慢的了,体验并不好,所以加一个能实时显示进度的功能,这样用户也能有感知。一定要有Content-Length!

weixin_57182748的博客 3355

基于ROS2系统开发机器人

以上是基于ROS 2开发机器人的基本流程和一个简单的发布者-订阅者示例。通过这个流程,你可以逐步扩展和优化你的机器人系统,实现更复杂的功能。

xuweilin的博客 1495

Cadence DSP 算子开发实战:从入门到精通

本文详细介绍了Cadence DSP算子开发的实战技巧,从入门基础到高级优化。内容涵盖DSP架构特性、内存管理、分块计算策略、SIMD指令优化等核心知识,并提供了性能调优和调试的实用技巧,帮助开发者快速掌握Cadence DSP开发精髓,提升图像处理等计算密集型任务的开发效率。

weixin_29278805的博客 435

vue+elementui实现文件下载和进度条显示

vue+elementui实现文件下载及显示进度条

xioxi 4279

(程序设计方法与实践)达拉崩吧的酒宴

达拉崩吧的酒宴 Description 很久很久以前,巨龙突然出现,带来灾难带走了公主又消失不见,王国十分危险,世间谁最勇敢,一位勇者赶来大声喊:“我要带上最好的剑,翻过最高的山,闯进最深的森林,把公主带回到面前”……最后,英雄 达拉崩巴斑得贝迪卜多比鲁翁 ,他战胜了巨龙 昆图库塔卡提考特苏瓦西拉松 ,国王把公主 米娅莫拉苏娜丹妮谢莉红 嫁给了 达拉崩巴斑得贝迪卜多比鲁翁 。 于是国王第二天要在 蒙达鲁克硫斯伯古比奇巴勒城 举办酒宴,一共准备了 N 桶酒。此时一位忠诚的仆人来报,有人在其中一桶酒里下毒,

What_If_I的博客 893

Vue实现关于下载上传的进度条

Vue实现里实现获取数据进度条前言注意 前言 实现上传文件的时候或者下载的时候,需要用到进度条 1.vue项目, 用的element ui组件库 代码调用片段: // 点击下载 clickDown() { // console.log('单个下载') let params = { 'xxx':'xyyxyxy' }; //注意 上传的方式不同 post/get 要区分下 var config = { onU

weixin_43645543的博客 4509

STC15单片机双串口通信实战:串口2配置与多设备交互

本文详细介绍了STC15单片机双串口通信的实战配置,重点解析串口2的硬件连接、寄存器设置及多设备交互实现。通过实际项目案例和完整代码示例,帮助开发者快速掌握STC15串口2的配置技巧,解决常见通信问题,提升嵌入式系统开发效率。

weixin_29174013的博客 256

abap中使用Screen painter为普通屏幕创建单选按钮组radiobutton组的过程

选择屏幕中,创建radiobutton组直接使用代码实现,如下所示 SELECTION-SCREEN BEGIN OF BLOCK BK1 WITH FRAME TITLE TEXT-001. PARAMETERS R1 RADIOBUTTON GROUP GR1. PARAMETERS R2 RADIOBUTTON GROUP GR1. PARAMETERS R3 RADIOBUTTON GR

charliefromkansas的博客 8302

.Net Core WebAPI + Axios +Vue 实现下载与下载进度条

写在前面老板说:系统很慢,下载半个小时无法下载,是否考虑先压缩再给用户下载?本来是已经压缩过了,不过第一反应应该是用户下的数量多,导致压缩包很大,然后自己测试发现,只是等待的时间比较久而...

dotNET跨平台 575

Vue3结合vue-office实现Word文档上传与预览全流程解析

本文详细解析了如何在Vue3项目中集成vue-office插件实现Word文档上传与预览功能。从项目初始化、插件安装到文件上传处理(包括ArrayBuffer转换)、预览优化及常见问题解决方案,提供了一套完整的实现流程,帮助开发者快速实现高效的文档预览功能。

weixin_29001327的博客 464

使用axios实现实时获取文件上传/下载进度。实现文件上传,下载进度条显示

下载文件实现进度条显示 利用axios封装的原生onDownloadProgress属性,该属性为一个回调方法,当axios请求将文件从服务器下载时会进行回调。接收一个回调参数,该回调参数中包含总下载进度,当前下载进度。不多比比直接上代码 <template> <div> <button @click="downLoad">下载</button> <p> 下载进度:{{downLoadProgres

weixin_54000091的博客 1万+

倍福控制第三方伺服走CSV模式--以汇川伺服为例

在使用TwinCAT软件控制标准CiA402协议的EtherCAT伺服时使用TwinCAT软件NC自带的运动控制指令控制伺服,此时伺服驱动器一般工作在CSP/CSV/CST模式。最常见伺服驱动器工作在CSP模式,轨迹规划运行在TwinCAT软件,位置环速度环电流环运行在伺服驱动器中。该模式下速度波动较大,需要极度平稳的速度需要采用CSV模式。本文讲述的是伺服驱动器工作在CSV模式,此时轨迹规划和位置环均运行在TwinCAT软件,速度环电流环运行在伺服驱动器中。为了简化文字描述,本文采用图文结合的方式介绍伺服

weixin_41883890的博客 4848

SAP 管道业务(Pipeline Procurement)是用于水、电、气等不间断供应且无库存管理的物料采购场景,核心是消耗即记账、无库存持有,通过 MM-FI 集成实现实时负债与成本过账

摘要:SAP管道业务适用于水电气等无库存管理的物料采购场景,通过消耗即记账机制实现实时负债与成本过账。核心配置包括创建PIPE物料类型(无库存管理)、维护管道采购信息记录、配置自动记账科目等。SAP PO可集成外部系统实现流程自动化,如自动过账提取数据、发票校验等。实施要点在于物料主数据、信息记录和科目确定的精准配置,以及PO接口的可靠对接,最终构建端到端的高效采购与财务结算体系。

金牌架构师 748

下载进度条

vue实现下载进度条

weixin_59101740的博客 941

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

初识vue(17)—— 使用 element-ui 的 el-upload 实现文件下载与上传进度条

  最近写项目遇到了上传文件显示进度条问题,后来网上学习了一波,最后整理了一下自己成功的方案。   每一部分代码如下:   HTML代码: <template> <el-upload class="upload-demo" action="在这里写上传的接口" :show-file-list="false" :before-upload="beforeUpload" :http-request="handleRequest">

小R.的博客 1838

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Vue 文件上传和“假进度显示“

系统中文件上传需要耗费部分时间,本文注重前端Vue怎么编写上传功能和显示假进度 1、Vue部分代码如下: <template> <div> <el-dialog title="提示" :visible.sync="dialogVisible" width="30%"> <el-upload ref="upload" :action="''" :file-list="fileList"

OneForYou97的博客 1241

记一次简单却没做出来的操作

公司项目需要前端文件管理点击上传按钮显示状态,用vue+element,当时想着so easy,但是实际操作时候看到elment中table用的插槽去渲染每一列数据做出来效果如下 现在就需要点击下载显示其进度条,想了半天,一顿操作猛如虎,结果最后是弟弟,最后万能的师傅出手了,直接添加一个data加入一个新数组,每次点击下载会往数据传当前的scope的id值push到新数组中,进度条只要判断当...

qq_42091045的博客 249

vue项目从后端下载文件显示进度条或者loading

【代码】vue项目从后端下载文件显示进度条或者loading。

eight_eyes_fish的博客 2245

vue + element-ui + springboot 实现文件下载进度条展现功能

vue + element-ui + springboot 实现文件下载进度条展现功能 最终效果图 1. 需求背景 最近接到一个优化需求,原系统文件下载功能体验不友好,特别是下载一些比较耗时的文件,用户在页面上傻等不知道下载的进度是怎么样的,总以为是系统卡死了。 2. 优化方案 后台优化下载速度(可以研究一下分片下载,这里不做展开) 改造前端用户体验(比如点击下载后你要显示出来进度,让客户知道已经在下载中了) 3. 具体实现 这里选择了2.2中的方案,改造前端用户体验,写这篇文章的目的是记录当时的解决

好好学习,不断总结 7952

vue与elementUI进度条组件并控制进度条加载速度(文件下载为例)

vue与elementUI进度条组件并控制进度条加载速度(文件下载为例) 这里采用的“假进度条”,触发下载时先让他平稳加载,最后加载完成直接百分之百。 采用progress进度条组件 点击确定下载按钮,会显示进度条,并且每隔500ms加载5%。 下面就调用接口,调用完成就this.progressPercent=100

00年女程序员分享自己的学习笔记 5375

Vue项目中实现附件下载并实时显示进度条

通过以上步骤,我们成功地在Vue项目中实现了附件下载并实时显示进度条的功能。这个功能不仅提升了用户体验,还使得文件下载过程更加直观。希望这篇博客能够帮助到大家,如果你有任何疑问或建议,欢迎在评论区留言交流。

Jiaberrr的博客 2091

文件管理大全,springboot操作文件,文件夹的上传,下载,进度条显示,新建,删除,重命名文件

文件管理大全,springboot操作文件,文件夹的上传,下载,进度条显示,新建,删除,重命名文件说明1.多文件上传2. 文件夹上传3.文件上传的进度条实现4.根据根目录的路径,递归获取改目录下的所有目录5.根据目录的路径,获取改目录下的所有文件信息详情6.创建文件夹,名字重复就在后面加name(1),name(2)采用windows文件重命名方法7.修改文件夹名称,也支持修改文件名8.递归删除文...

qq_38362127的博客 5408

vue上传文件并显示进度条

keepFileList 用来备份选择的文件列表,因取消下载后文件列表会被清空,导致不能继续上传。手动使用submit()上传。

IT菜鸟 1万+
上一篇: 前端生成word导出
下一篇: echarts下载图片
祝你今天也快乐
博客等级 码龄6年 4540粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值