vue下载文件时显示进度条

server/2024/9/23 9:00:04/

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数据只是前端需要 用来判断显示 按钮还是进度条的所以就手动给数组添加响应式数据

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

js部分

javascript">  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方法

javascript">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

javascript">    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();},

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

javascript">/*** 对象深拷贝*/
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设置的

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

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

javascript">".*"="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.ppmy.cn/server/17153.html

相关文章

网络安全(黑客技术)—2024最新自学手册

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

【数据结构-串-数组-广义表】

目录 1 串-理解1.1 串的抽象定义&#xff1a;-理解1.2 串的存储结构-不断掌握1.2.1 顺序存储结构&#xff1a;1.2.2 链式存储结构&#xff1a; 1.3 串的模式匹配算法&#xff1a;-掌握1.3.1 BF暴力求解算法-代码 -掌握1.3.2 KMP求解算法-代码--掌握 2 数组-不断掌握2.1 顺序存储…

C语言进阶课程学习记录 - 函数的意义

C语言进阶课程学习记录 - 函数的意义 实验-声明与定义小结 本文学习自狄泰软件学院 唐佐林老师的 C语言进阶课程&#xff0c;图片全部来源于课程PPT&#xff0c;仅用于个人学习记录 实验-声明与定义 //global.c #include <stdio.h>//int g_var 10;//case1float g_var …

Vitis AI 迁移学习并部署在DPU中

目录 1. 本文目的 2. ResNet18介绍 3. 迁移学习 4. 量化配置文件 5. 模型编译&#xff1a; 6. 总结 1. 本文目的 使用迁移学习的方法&#xff0c;将预训练的resnet18模型从原来的1000类分类任务&#xff0c;改造为适应自定义的30类分类任务。 2. ResNet18介绍 ResNet1…

matlab新手快速上手6(引力搜索算法)

本文根据一个较为简单的matlab引力搜索算法框架详细分析蚁群算法的实现过程&#xff0c;对matlab新手友好&#xff0c;源码在文末给出。 引力搜索算法简介&#xff1a; 引力搜索算法是一种启发式优化算法&#xff0c;最初于2009年由伊朗的Esmat Rashedi、Hossein Nezamabadi-p…

node.js-包

包的概念 包&#xff1a;将模块&#xff0c;代码&#xff0c;其他资料聚合成的一个文件夹 包分类&#xff1a; 1.项目包&#xff1a;主要用于编写项目和业务逻辑的文件夹 2.软件包&#xff1a;封装工具和方法供开发者使用&#xff08;一般使用npm管理&#xff09; 1&#…

MySQL-数据目录

一、MySQL的主要目录结构&#xff08;MySQL 8&#xff09; [rootlocalhost ~]# find / -name mysql find: ‘/proc/30845’: 没有那个文件或目录 find: ‘/proc/30855’: 没有那个文件或目录 /etc/logrotate.d/mysql /etc/selinux/targeted/active/modules/100/mysql /etc/sel…

平抑风电波动的电-氢混合储能容量优化配置

这篇论文中的EMD分解法在非线性扰动信号分解上优于小波分解法,EMD分解出来的imf各频次信号,继而利用C2F实现信号重构,根据最大波动量限值剔除出需要储能平抑的波动量,继而用超级电容实现平抑(论文中用的碱水电解槽+燃料电池我认为有很多个点可以佐证不合适,但是电制氢是热…