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 相关文章推荐
Extjs中ComboBox加载并赋初值的实现方法
Mar 22 Javascript
js+HTML5实现canvas多种颜色渐变效果的方法
Jun 05 Javascript
jQuery实现选项卡切换效果简单演示
Dec 09 Javascript
浅谈js中test()函数在正则中的使用
Aug 19 Javascript
JavaScript的兼容性与调试技巧
Nov 22 Javascript
node.js实现复制文本到剪切板的功能
Jan 23 Javascript
Vue.js render方法使用详解
Apr 05 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
Jul 26 Javascript
js Date()日期函数浏览器兼容问题解决方法
Sep 12 Javascript
jQuery内容过滤选择器与子元素过滤选择器用法实例分析
Feb 20 jQuery
vue draggable resizable gorkys与v-chart使用与总结
Sep 05 Javascript
js实现类选择器和name属性选择器的示例步骤
Feb 07 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
重置版宣传动画
2020/04/09 魔兽争霸
PHP命名空间(Namespace)的使用详解
2013/05/04 PHP
php读取文件内容的几种方法详解
2013/06/26 PHP
php强制文件下载而非在浏览器打开的自定义函数分享
2014/05/08 PHP
PHP内置过滤器FILTER使用实例
2014/06/25 PHP
ThinkPHP让分页保持搜索状态的方法
2014/07/02 PHP
WIN8.1下搭建PHP5.6环境
2015/04/29 PHP
PHP将URL转换成短网址的算法分享
2016/09/13 PHP
php利用fsockopen GET/POST提交表单及上传文件
2017/05/22 PHP
关于PHP5.6+版本“No input file specified”问题的解决
2019/12/11 PHP
document.createElement()用法
2013/03/13 Javascript
jQuery实现下拉框选择图片功能实例
2015/08/08 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
thinkjs之页面跳转同步异步操作
2017/02/05 Javascript
js 原型对象和原型链理解
2017/02/09 Javascript
vue.js中v-on:textInput无法执行事件问题的解决过程
2017/07/12 Javascript
Javascript ES6中对象类型Sets的介绍与使用详解
2017/07/17 Javascript
vue组件发布到npm简单步骤
2017/11/30 Javascript
jQuery实现动态加载select下拉列表项功能示例
2018/05/31 jQuery
教你如何编写Vue.js的单元测试的方法
2018/10/17 Javascript
详解vuex的简单todolist例子
2019/07/14 Javascript
layui插件表单验证提交触发提交的例子
2019/09/09 Javascript
简洁的十分钟Python入门教程
2015/04/03 Python
Python3进制之间的转换代码实例
2019/08/24 Python
Python批量启动多线程代码实例
2020/02/18 Python
个人实用简单的自我评价
2013/10/19 职场文书
《三个小伙伴》教学反思
2014/04/11 职场文书
班组拓展活动方案
2014/08/14 职场文书
园艺专业毕业生求职信
2014/09/02 职场文书
2014年财务人员工作总结
2014/11/11 职场文书
慰问信模板
2015/02/14 职场文书
《月光曲》教学反思
2016/02/16 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL
解决Jenkins集成SonarQube遇到的报错问题
2021/07/15 Java/Android
pandas中关于apply+lambda的应用
2022/02/28 Python
【海涛教你打DOTA】死灵飞龙第一视角解说
2022/04/01 DOTA