当前位置: 首页 > news >正文

vue 全局封装文件下载及导入

根据响应数据进行文件的下载和处理,并在需要时调用回调函数进行进一步的处理或通知。

  • 在utils创建一个名为download.js的文件
import {Message} from 'element-ui'
// 接收多个参数:res(响应数据)、name(文件名)、fileType(文件类型)、lookType(是否预览)、callbackFunc和callback。
export function downLoadFile(res, name, fileType, lookType, callbackFunc, callback) {// 判断是否传入了文件名name,如果没有指定文件名但是响应头中包含了content-disposition,则从响应头中获取文件名let fileName = nameconst disposition = res.headers['content-disposition']if (!name && disposition) {const fileNames = disposition.substring(disposition.indexOf('filename=') + 9,disposition.length)fileName = fileNamesfileName = decodeURI(fileName)fileName = fileName.replace(/\"/g, '')}// 创建了一个FileReader对象,并设置了onload事件处理函数。// 在这个事件处理函数内部,先尝试将文件数据解析为JSON格式,如果解析成功且返回的数据中code等于200,// 则调用callbackFunc函数,并将解析后的数据传递给它。let fileReader = new FileReader()fileReader.onload = function () {try {let jsonData = JSON.parse(fileReader.result) // 说明是普通对象数据,后台转换失败if (jsonData.code == 200) {callbackFunc(jsonData, callback)} else {if (jsonData.message) {Message({message: jsonData.message || 'Error',type: 'error'})callbackFunc(jsonData)}}} catch (err) {// 如果解析JSON失败,则根据文件类型创建相应的Blob对象,并根据文件类型和查看类型进行不同的处理。// 例如,如果文件类型为PDF并且查看类型为预览,则在新窗口中打开PDF文件;// 否则根据浏览器兼容性使用不同的方式进行文件下载。let csvDataif (fileType == 'pdf') {csvData = new Blob([res.data], {type: 'application/pdf'})} else if (fileType == 'zip') {csvData = new Blob([res.data], {type: 'application/zip'})} else if (fileType == 'excel') {csvData = new Blob([res.data], {type: 'application/vnd.ms-excel'})} else {csvData = new Blob([res.data])}if (fileType == 'pdf' && lookType == 'preview') {var url = window.URL.createObjectURL(csvData)window.open(url, '_blank') // 新窗口打开,借用浏览器去打印} else {if (!!window.ActiveXObject || 'ActiveXObject' in window) {if (window.navigator && window.navigator.msSaveOrOpenBlob) {window.navigator.msSaveOrOpenBlob(csvData, fileName)}} else {const url = window.URL.createObjectURL(csvData)const link = document.createElement('a')link.style.display = 'none'link.href = urllink.download = `${fileName}`document.body.appendChild(link)link.click()document.body.removeChild(link)}}// 如果定义了callbackFunc,且之前没有调用过,则调用callbackFunc并传入一个表示错误的对象 {code:'error'}if (callbackFunc != undefined) {callbackFunc({code: 'error'}, callback)}}}fileReader.readAsText(res.data)
}
  • 页面引用
import { downLoadFile } from '@/utils/download'
// callback传入的是刷新页面的请求
handleDown(callback) {let response // 接口请求返回的结果downLoadFile(response,'','','',this.handleUploadData,callback)
},
handleUploadData(response,callback) {try {if(response.code == 200) {this.$commonMessage.message({type: 'success',message: '导入成功!'})callback&&callback()} else if(response.code=='error') {this.$commonMessage.message({type: 'error',message: '信息有误'})callback&&callback()} else {}}catch{}}

相关文章:

  • Hadoop学习笔记(HDP)-Part.13 安装Ranger
  • 【开源】基于Vue+SpringBoot的数据可视化的智慧河南大屏
  • less 笔记
  • 线程池,及7大参数,4大拒绝策略详解
  • 实施工程师运维工程师面试题
  • QT 中 QProgressDialog 进度条窗口 备查
  • 网上选课系统源码(Java)
  • Springboot:kafka运行成功,报错InvalidTopicException
  • 【OpenGauss源码学习 —— (VecToRow)算子】
  • Mybatis XML 配置文件
  • 信号可靠性剖析
  • JVM之四种引用类型(五)
  • 使用 OpenFunction 在任何基础设施上运行 Serverless 工作负载
  • Python网络爬虫环境的安装指南
  • ES6中 对象合并
  • 网络传输文件的问题
  • ComponentOne 2017 V2版本正式发布
  • create-react-app做的留言板
  • CSS 提示工具(Tooltip)
  • css系列之关于字体的事
  • jQuery(一)
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • tensorflow学习笔记3——MNIST应用篇
  • Travix是如何部署应用程序到Kubernetes上的
  • Vue ES6 Jade Scss Webpack Gulp
  • vue自定义指令实现v-tap插件
  • 大主子表关联的性能优化方法
  • 给Prometheus造假数据的方法
  • 扑朔迷离的属性和特性【彻底弄清】
  • 一道闭包题引发的思考
  • ionic异常记录
  • 正则表达式-基础知识Review
  • ###STL(标准模板库)
  • #define用法
  • #gStore-weekly | gStore最新版本1.0之三角形计数函数的使用
  • (13)[Xamarin.Android] 不同分辨率下的图片使用概论
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (续)使用Django搭建一个完整的项目(Centos7+Nginx)
  • (一)认识微服务
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (轉貼) UML中文FAQ (OO) (UML)
  • .Mobi域名介绍
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core MVC 通过 Filters 过滤器拦截请求及响应内容
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • /proc/vmstat 详解
  • @transactional 方法执行完再commit_当@Transactional遇到@CacheEvict,你的代码是不是有bug!...
  • [100天算法】-x 的平方根(day 61)
  • [20140403]查询是否产生日志
  • [Android开源]EasySharedPreferences:优雅的进行SharedPreferences数据存储操作
  • [CUDA手搓]从零开始用C++ CUDA搭建一个卷积神经网络(LeNet),了解神经网络各个层背后算法原理
  • [datastore@cyberfear.com].Elbie、[thekeyishere@cock.li].Elbie勒索病毒数据怎么处理|数据解密恢复
  • [Foreman]解决Unable to find internal system admin account
  • [MYSQL数据库]- 索引