vue-以文件流-blob-的形式-下载-导出文件操作


Posted in Javascript onAugust 07, 2020

vue项目中,经常遇到文件导出与下载,有时候是直接返回服务端的文件url,这样直接以a链接下载,或者windown.open对不同类型的文件进行下载或预览。但如果返回的是文件流,则需要做一些其他处理,具体形式如下:

1、首先要确定服务器返回的数据类型。

在请求头中加入: config.responseType = 'blob'

有时候,不是所有接口都需要该类型,则可以对接口做一个判定:

// request拦截器
service.interceptors.request.use(
 config => { // 根据接口判定
  if ( config.url === '/setting/exportData' ||
  config.url.indexOf('export') > -1 ||
  config.url.indexOf('Export') > -1) {
   config.responseType = 'blob' // 服务请求类型
  }
  if (getToken()) {
   config.headers['access_token'] = getToken()
  }
  return config
 },
 error => {
  // Do something with request error
  // console.log(error) // for debug
  Promise.reject(error)
 }
)

2、接口请求获取后端返回的文件流

// 导出
  onExport() {
   if (this.dataList === '') {
    this.$message({
     type: 'error',
     message: '暂无数据导出'
    })
    return
   }
   const fd = new FormData()
   fd.append('id', this.id)
   var exportFileName = '导出文件名' //设置导出的文件名,可以拼接一个随机值
   exportData(fd)
    .then(res => {
     // res.data 是后端返回的文件流
     // 调用 downloadUrl 处理文件
     downloadUrl(res.data, exportFileName)
    })
    .catch(err => {
     this.$message({
      type: 'error',
      message: err.message
     })
    })
  },

3、文件处理downloadUrl--该方法可以写为公共方法以便调用

// 使用iframe框架下载文件--以excel为例,可修改type与fileName选择文件类型
export function downloadUrl(res, name) {
 const blob = new Blob([res], { type: 'application/vnd.ms-excel' }) // 构造一个blob对象来处理数据
 const fileName = name + '.xlsx' // 导出文件名
 const elink = document.createElement('a') // 创建a标签
 elink.download = fileName // a标签添加属性
 elink.style.display = 'none'
 elink.href = URL.createObjectURL(blob)
 document.body.appendChild(elink)
 elink.click() // 执行下载
 URL.revokeObjectURL(elink.href) // 释放URL 对象
 document.body.removeChild(elink) // 释放标签
}

4、在ie浏览器中存在兼容性问题,对downloadUrl做一些调整

// 使用iframe框架下载文件 -兼容性考虑
export function downloadUrl(res, name) {
 const blob = new Blob([res], { type: 'application/vnd.ms-excel' })
 // for IE
 if (window.navigator && window.navigator.msSaveOrOpenBlob) {
  const fileName = name + '.xlsx'
  window.navigator.msSaveOrOpenBlob(blob, fileName)
 } else {
  // for Non-IE (chrome, firefox etc.)
  const fileName = name + '.xlsx'
  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)
 }
}

总结:至此,以文件流的形式导出文件的一种方式便已经实现。

补充知识:vue中使用文件流进行下载(new Blob),不打开一个新页面下载

我就废话不多说了,大家还是直接看代码吧~

export function download (url, params, filename) {
 
 Message.warning('导出数据中')
 return axios.get(url, {
  params: params,
  responseType:'arraybuffer',
 }).then((r) => {
 
  const content = r.data
  const blob = new Blob([content],{type:'application/vnd.ms-excel'})
  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)
   Message.success('导出成功')
 
  }
 
 }).catch((r) => {
  console.error(r)
  Message.error('导出失败')
 
 })
}

以上这篇vue-以文件流-blob-的形式-下载-导出文件操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
静态的动态续篇之来点XML
Dec 23 Javascript
自适应高度框架 ----属个人收藏内容
Jan 22 Javascript
javascript 一个函数对同一元素的多个事件响应
Jul 25 Javascript
Firefox下提示illegal character并出现乱码的原因
Mar 25 Javascript
基于jQuery实现的图片切换焦点图整理
Dec 07 Javascript
jQuery.position()方法获取不到值的安全替换方法
Mar 13 Javascript
jQuery生成假加载动画效果
Dec 01 Javascript
JS定时检测任务任务完成后执行下一步的解决办法
Dec 22 Javascript
原生js实现节日时间倒计时功能
Jan 18 Javascript
JavaScript中错误正确处理方式小结你用对了吗
Oct 10 Javascript
微信小程序文章详情页面实现代码
Sep 10 Javascript
vue限制输入框只能输入8位整数和2位小数的代码
Nov 06 Javascript
浅谈javascript如何获取文件后缀名
Aug 07 #Javascript
vue 使用post/get 下载导出文件操作
Aug 07 #Javascript
基于javascript的无缝滚动动画实现2
Aug 07 #Javascript
vue 在methods中调用mounted的实现操作
Aug 07 #Javascript
javascript实现图片轮换动作方法
Aug 07 #Javascript
vue style width a href动态拼接问题的解决
Aug 07 #Javascript
vue 保留两位小数 不能直接用toFixed(2) 的解决
Aug 07 #Javascript
You might like
用PHP实现验证码功能
2006/10/09 PHP
对Session和Cookie的区分与解释
2007/03/16 PHP
php数据库抽象层 PDO
2011/05/07 PHP
thinkphp实现上一篇与下一篇的方法
2014/12/08 PHP
PHP中is_file()函数使用指南
2015/05/08 PHP
WordPress中的shortcode短代码功能使用详解
2016/05/17 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
PHP设计模式概论【概念、分类、原则等】
2020/05/01 PHP
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
用js调用迅雷下载代码的二种方法
2013/04/15 Javascript
AMD异步模块定义介绍和Require.js中使用jQuery及jQuery插件的方法
2014/06/06 Javascript
移动Web中图片自适应的两种JavaScript解决方法
2015/06/18 Javascript
每天一篇javascript学习小结(面向对象编程)
2015/11/20 Javascript
jQuery实现的事件绑定功能基本示例
2017/10/11 jQuery
浅谈Koa服务限流方法实践
2017/10/23 Javascript
浅析JS中什么是自定义react数据验证组件
2018/10/19 Javascript
jquery的$().each和$.each的区别
2019/01/18 jQuery
如何在vue项目中嵌入jsp页面的方法(2种)
2020/02/06 Javascript
js将URL网址转为16进制加密与解密函数
2020/03/04 Javascript
Python中的装饰器用法详解
2015/01/14 Python
Python全局变量用法实例分析
2016/07/19 Python
python requests 使用快速入门
2017/08/31 Python
Python使用pylab库实现绘制直方图功能示例
2018/06/01 Python
对matplotlib改变colorbar位置和方向的方法详解
2018/12/13 Python
python将txt文档每行内容循环插入数据库的方法
2018/12/28 Python
linux 下python多线程递归复制文件夹及文件夹中的文件
2020/01/02 Python
全球知名提供各类营养保健品的零售商:Vitamin Shoppe
2016/10/09 全球购物
Pretty Little Thing美国:时尚女性服饰
2018/08/27 全球购物
函数指针的定义是什么
2016/08/14 面试题
2014年母亲节演讲稿范文
2014/05/07 职场文书
入职担保书怎么写
2014/05/12 职场文书
违章停车检讨书
2014/10/21 职场文书
关于调整工作时间的通知
2015/04/24 职场文书
2015年教导处教学工作总结
2015/07/22 职场文书
python 爬取吉首大学网站成绩单
2021/06/02 Python
Pytorch中的学习率衰减及其用法详解
2021/06/05 Python