vue下载文件时显示进度条

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.datadata.forEach((x) => {if (x.id === row.id) {x.schedule = truex.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.dataconst blob = new Blob([content],{type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'})if ('download' in document.createElement('a')) {const elink = document.createElement('a')elink.download = filenameelink.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'){// IElet blob = new Blob([content], {type: 'application/force-download'});navigator.msSaveBlob(blob, filename)}else {// Firefoxvar 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-bodywidth="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=truethis.selectionList.forEach(item=>{this.exportReport(item)})});}).catch(() => {});},//关闭弹框清空选中状态toClose(){this.visible=falsethis.onLoad(this.page);this.$refs.crud.toggleSelection();},

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

/*** 对象深拷贝*/
export const deepClone = data => {var type = getObjType(data)var objif (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没有进度条效果 所以出此下策 请辨别哦~~~~) 

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3661.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

cocos-lua资源管理

本文介绍cocos-lua项目的资源管理和工作流&#xff0c;适用人群包括初学者和有经验开发者&#xff0c;故读者可根据自己的需要有选择性的查阅自己需要的内容 一.简单案例解析 下文通过介绍一个简单demo&#xff0c;介绍合图和资源目录结构 1.1 运行效果 1.2 ccs结构 1.3 目录…

PCA-KPCA 故障诊断

核主成分分析&#xff08;KPCA&#xff09; - 知乎 (zhihu.com) paper:Multi-fault diagnosis for series-connected lithium-ion battery pack with reconstruction-based contribution based on parallel PCA-KPCA

【Python-Spark(大规模数据)】

Python-Spark&#xff08;大规模数据&#xff09; ■ Spark■ PySparl编程模型■ 基础准备■ 数据输入■ RDD的map成员方法的使用■ RDD的flatMap成员方法的使用■ RDD的reduceByKey成员方法的使用■ 单词计数统计■ RDD的filter成员方法的使用■ RDD的distinct成员方法的使用■…

LANGUAGE-DRIVEN SEMANTIC SEGMENTATION

环境不易满足&#xff0c;不建议复现

详解js中的console对象

对于前端开发而言&#xff0c;console对象大家肯定都很熟悉&#xff0c;最常用的 console.log() 是开发调试必用的 但是对于console对象的其他方法&#xff0c;相对而言使用的就比较少了。下面详细介绍一下&#xff1a; 谷歌浏览器输出console对象&#xff1a; 值得一提的是不…

qt文件操作的一些技巧

二、多线程处理大文件的最佳实践 1、避免共享状态 最根本解决方案是避免多个线程访问同一资源。我们可以将大文件分割成多个独立部分&#xff0c;分别由不同线程独占处理。只需引入一些同步点&#xff0c;进行简单的合并即可。 2、合理利用互斥量和读写锁 如果无法避免共享…

JAVA MQTT 发布主题请求,订阅主题接收,订阅主题回复,发布主题再接收回复,三步走

先看效果 一、准备工作 1.官网下载emqx压缩包放到自己的盘符下&#xff0c;不要带中文路径 下载 EMQX 2.在路径的bin中&#xff0c;cmd&#xff0c;启动emqx服务 emqx start 3.访问服务&#xff0c;能打开就证明启动成功&#xff0c;登录的话官网默认的密码账号&#xff08;…

【C#】Stopwatch计时器

使用Stopwatch检查C#中代码块的执行时间&#xff0c;比如歌曲&#xff0c;图片的下载时间问题 首先&#xff0c;我们可看到Stopwatch 类内部的函数。 根据需求&#xff0c;我们具体可使用到 Start() 开始计时&#xff0c;Stop() 停止计时等 //创建 Stopwatch 实例 Stopwatch …

STM32单片机C语言模块化编程实战:LED控制详解与示例

一、开发环境 硬件&#xff1a;正点原子探索者 V3 STM32F407 开发板 单片机&#xff1a;STM32F407ZGT6 Keil版本&#xff1a;5.32 STM32CubeMX版本&#xff1a;6.9.2 STM32Cube MCU Packges版本&#xff1a;STM32F4 V1.27.1 之前介绍了很多关于点灯的方法&#xff0c;比如…

ARM DMIPS算力说明

ARM DMIPS算力说明 ARM算力参考官网地址 https://en.wikipedia.org/wiki/List_of_ARM_processors Product familyARM architectureProcessorFeatureCache (I / D), MMUTypical MIPS MHzReferenceARM1ARMv1ARM1First implementationNoneARM2ARMv2ARM2ARMv2 added the MUL (mu…

【SSM进阶学习系列丨整合篇】Spring+SpringMVC+MyBatis 框架配置详解

文章目录 一、环境准备1.1、创建数据库和表1.2、导入框架依赖的jar包1.3、修改Maven的编译版本1.4、完善Maven目录1.5、编写项目需要的包1.6、编写实体、Mapper、Service 二、配置MyBatis环境2.1、配置mybatis的主配置文件2.2、编写映射文件2.3、测试环境是否正确 三、配置Spri…

el-table 三角形提示

<template><div><el-table :data"tableData" style"width: 100%"><el-table-column prop"ddd" label"日期2" width"150" /><el-table-column prop"ddd" label"日期2" width…

[C++][算法基础]分组背包问题(动态规划)

有 &#x1d441; 组物品和一个容量是 &#x1d449; 的背包。 每组物品有若干个&#xff0c;同一组内的物品最多只能选一个。 每件物品的体积是 &#xff0c;价值是 &#xff0c;其中 &#x1d456; 是组号&#xff0c;&#x1d457; 是组内编号。 求解将哪些物品装入背包&a…

iOS CI/CD 持续集成 组件化专题二 Cocoapods /Cocoapods Packager 问题汇总

执行pod package xxx.podspec --force --no-mangle --exclude-deps --verbose 报错 warning: Building targets in manual order is deprecated - check "Parallelize build for command-line builds" in the project editor, or set DISABLE_MANUAL_TARGET_ORDER_BU…

Linux 静态IP地址修改与报错处理

目录 查看网卡信息 Ubuntu 16.04.5 LTS、Ubuntu 20.04.6 LTS Ubuntu 18.04.6 LTS Centos 8.0 修改IP地址 将IP地址置空 确认修改是否生效 查看网卡信息 ifconfig ifconfig -a Ubuntu 16.04.5 LTS、Ubuntu 20.04.6 LTS 修改配置 vim /etc/network/interfaces # This …

AI大模型探索之路-训练篇1:大语言模型微调基础认知

文章目录 前言一、微调技术概述二、微调的必要性三、大模型的微调方法四、微调过程中的技术细节五、微调后的模型评估与应用总结 前言 在人工智能的广阔研究领域内&#xff0c;大型预训练语言模型&#xff08;Large Language Models, LLMs&#xff09;已经成为推动技术革新的关…

一、路由基础

1.路由协议的优先级 路由器分别定义了外部优先级和内部优先级&#xff08;越小越优&#xff09; 路由选择顺序&#xff1a;外部优先级>>内部优先级&#xff08;相同时&#xff09; ①外部优先级&#xff1a;用户可以手工为各路由协议配置的优先级 ②内部优先级&#xf…

go开发环境安装配置(vscode)

安装 变量 $GOROOT 表示 Go 在你的电脑上的安装位置 $GOARCH 表示目标机器的处理器架构,它的值可以是 386、amd64 或 arm $GOOS 表示目标机器的操作系统,它的值可以是 darwin、freebsd、linux 或 windows $GOBIN 表示编译器和链接器的安装位置,默认是 $GOROOT/bin,Go 1.0.3可…

目标检测YOLO实战应用案例100讲-基于YOLOv5的目标检测与6D位姿估计算法研究(中)

目录 3.3 相机成像原理 3.3.1 坐标系的建立及关系 3.3.2 相机标定 3.3.3 相机畸变

天星金融普及个人养老金制度,共筑老龄友好型社会

在人口老龄化的浪潮中&#xff0c;我国正面临着日益严峻的养老挑战。据国家卫健委数据显示&#xff0c;预计到2035年&#xff0c;我国60岁及以上人口占总人口的比例将超过30%&#xff0c;构建老龄友好型社会已成为国家发展的重要任务。在这一背景下&#xff0c;个人养老金制度的…