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模拟struts2的多action调用示例
May 19 Javascript
用简洁的jQuery方法toggleClass实现隔行换色
Oct 22 Javascript
JavaScript禁止复制与粘贴的实现代码
May 16 Javascript
jQuery 跨域访问解决原理案例详解
Jul 09 Javascript
js Canvas绘制圆形时钟教程
Feb 06 Javascript
JS返回顶部实例代码
Aug 09 Javascript
理顺8个版本vue的区别(小结)
Sep 17 Javascript
深入理解移动前端开发之viewport
Oct 19 Javascript
vue自定义指令的创建和使用方法实例分析
Dec 04 Javascript
Vue指令之 v-cloak、v-text、v-html实例详解
Aug 08 Javascript
ES6箭头函数和扩展实例分析
May 23 Javascript
js+css3实现炫酷时钟
Aug 18 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
Zend引擎的发展 [15]
2006/10/09 PHP
提高define性能的php扩展hidef的安装和使用
2011/06/14 PHP
浅析ThinkPHP的模板输出功能
2014/07/01 PHP
PHP字符串word末字符实现大小写互换的方法
2014/11/10 PHP
php获取用户浏览器版本的方法
2015/01/03 PHP
PHP基于mssql扩展远程连接MSSQL的简单实现方法
2016/10/08 PHP
JavaScript Object的extend是一个常用的功能
2009/12/02 Javascript
ie中js创建checkbox默认选中问题探讨
2013/10/21 Javascript
Js使用WScript.Shell对象执行.bat文件和cmd命令
2014/12/18 Javascript
JavaScript Sort 的一个错误用法示例
2015/03/20 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
在AngularJS框架中处理数据建模的方式解析
2016/03/05 Javascript
NodeJs的优势和适合开发的程序
2016/08/14 NodeJs
常用jQuery选择器汇总
2017/02/02 Javascript
如何从零开始利用js手写一个Promise库详解
2018/04/19 Javascript
基于vue2的canvas时钟倒计时组件步骤解析
2018/11/05 Javascript
electron 安装,调试,打包的具体使用
2019/11/06 Javascript
详解vite+ts快速搭建vue3项目以及介绍相关特性
2021/02/25 Vue.js
Python修改Excel数据的实例代码
2013/11/01 Python
Python迭代器和生成器介绍
2015/03/06 Python
用Python写一个无界面的2048小游戏
2016/05/24 Python
Python常见MongoDB数据库操作实例总结
2018/07/24 Python
使用python实现http及ftp服务进行数据传输的方法
2018/10/26 Python
对Python 语音识别框架详解
2018/12/24 Python
python scp 批量同步文件的实现方法
2019/01/03 Python
PyCharm中代码字体大小调整方法
2019/07/29 Python
Python cookie的保存与读取、SSL讲解
2020/02/17 Python
Python3之外部文件调用Django程序操作model等文件实现方式
2020/04/07 Python
Python3爬虫发送请求的知识点实例
2020/07/30 Python
美国滑雪板和装备购物网站:Skis.com
2018/12/20 全球购物
经典洗发水广告词
2014/03/13 职场文书
反对四风自我剖析材料
2014/10/07 职场文书
2014年教研员工作总结
2014/12/23 职场文书
Java数据结构之链表相关知识总结
2021/06/18 Java/Android
MySql 8.0及对应驱动包匹配的注意点说明
2021/06/23 MySQL
python编程项目中线上问题排查与解决
2021/11/01 Python