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 相关文章推荐
用js写了一个类似php的print_r输出换行功能
Feb 18 Javascript
js将iframe中控件的值传到主页面控件中的实现方法
Mar 11 Javascript
Javascript级联下拉菜单以及AJAX数据验证核心代码
May 10 Javascript
iframe的父子窗口之间的对象相互调用基本用法
Sep 03 Javascript
jQuery中hover与mouseover和mouseout的区别分析
Dec 24 Javascript
老生常谈onBlur事件与onfocus事件(js)
Jul 09 Javascript
微信小程序 触控事件详细介绍
Oct 17 Javascript
快速掌握jQuery插件开发
Jan 19 Javascript
JS常见简单正则表达式验证功能小结【手机,地址,企业税号,金额,身份证等】
Jan 22 Javascript
Bootstrap modal 多弹窗之叠加显示不出弹窗问题的解决方案
Feb 23 Javascript
AngularJS表单验证功能
Oct 19 Javascript
js实现整体缩放页面适配移动端
Mar 31 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
咖啡与水的关系
2021/03/03 冲泡冲煮
PHP读取txt文件的内容并赋值给数组的代码
2011/11/03 PHP
PHP计算百度地图两个GPS坐标之间距离的方法
2015/01/09 PHP
[原创]php简单防盗链验证实现方法
2016/07/09 PHP
超强多功能php绿色集成环境详解
2017/01/25 PHP
详解php语言最牛掰的Laravel框架
2017/11/20 PHP
laravel框架数据库操作、查询构建器、Eloquent ORM操作实例分析
2019/12/20 PHP
JS读取XML文件示例代码
2013/11/15 Javascript
jQuery如何取id有.的值一般的方法是取不到的
2014/04/18 Javascript
javascript event在FF和IE的兼容传参心得(绝对好用)
2014/07/10 Javascript
js实现上传图片预览的方法
2015/02/09 Javascript
JavaScript使用indexOf获得子字符串在字符串中位置的方法
2015/04/06 Javascript
为何JS操作的href都是javascript:void(0);呢
2015/11/12 Javascript
javascript与jquery中的this关键字用法实例分析
2015/12/24 Javascript
JavaScript绑定事件监听函数的通用方法
2016/05/14 Javascript
Javascript 基础---Ajax入门必看
2016/07/06 Javascript
关于react-router的几种配置方式详解
2017/07/24 Javascript
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
javascript实现贪吃蛇小游戏
2020/07/28 Javascript
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
快速排序的算法思想及Python版快速排序的实现示例
2016/07/02 Python
Python爬虫实现全国失信被执行人名单查询功能示例
2018/05/03 Python
python实现的批量分析xml标签中各个类别个数功能示例
2019/12/30 Python
python如何导入依赖包
2020/07/13 Python
Scrapy实现模拟登录的示例代码
2021/02/21 Python
广告设计专业自荐信范文
2013/11/14 职场文书
2014年五一活动策划方案
2014/03/15 职场文书
市场总经理岗位职责
2014/04/11 职场文书
车辆转让协议书
2014/09/24 职场文书
学生自我评语
2015/01/04 职场文书
2016同学毕业寄语大全
2015/12/04 职场文书
2016年村党支部公开承诺书
2016/03/24 职场文书
火锅店的开业营销方案范本!
2019/07/05 职场文书
python 爬取豆瓣网页的示例
2021/04/13 Python
用golang如何替换某个文件中的字符串
2021/04/25 Golang
剧场版《转生恶役只好拔除破灭旗标》公开最新视觉图 2023年上映
2022/04/02 日漫