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 相关文章推荐
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
Jul 18 Javascript
jQuery开发者都需要知道的5个小技巧
Jan 08 Javascript
jQuery的内容过滤选择器学习教程
Apr 18 Javascript
jquery实现下拉框功能效果【实例代码】
May 06 Javascript
javascript 数组去重复(在线去重工具)
Dec 17 Javascript
AngularJS基于provider实现全局变量的读取和赋值方法
Jun 28 Javascript
Vue.js如何实现路由懒加载浅析
Aug 14 Javascript
详谈js中标准for循环与foreach(for in)的区别
Nov 02 Javascript
JS实现判断图片是否加载完成的方法分析
Jul 31 Javascript
JS实现数组深拷贝的方法分析
Mar 06 Javascript
vue中利用Promise封装jsonp并调取数据
Jun 18 Javascript
简单了解JavaScript sort方法
Nov 25 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 中英文语言转换类代码
2011/08/11 PHP
php5.3 注意事项说明
2013/07/01 PHP
Symfony2在Nginx下的配置方法图文教程
2016/02/04 PHP
JQuery EasyUI 对话框的使用方法
2010/10/24 Javascript
神奇的7个jQuery 3D插件整理
2011/01/06 Javascript
javascript上下方向键控制表格行选中并高亮显示的方法
2015/02/13 Javascript
JS+CSS实现淡入式焦点图片幻灯切换效果的方法
2015/02/26 Javascript
浅谈Sticky组件的改进实现
2016/03/22 Javascript
jQuery实时显示鼠标指针位置和键盘ASCII码
2016/03/28 Javascript
AngularJs Javascript MVC 框架
2016/06/20 Javascript
jQuery实现的自定义弹出层效果实例详解
2016/09/04 Javascript
JavaScript轮播图简单制作方法
2017/02/20 Javascript
Bootstrap如何激活导航状态
2017/03/22 Javascript
js下载文件并修改文件名
2017/05/08 Javascript
bootstrap基本配置_动力节点Java学院整理
2017/07/14 Javascript
Bootstrap模态对话框用法简单示例
2018/08/31 Javascript
electron实现静默打印的示例代码
2019/08/12 Javascript
Websocket 向指定用户发消息的方法
2020/01/09 Javascript
Python基于twisted实现简单的web服务器
2014/09/29 Python
python使用urlparse分析网址中域名的方法
2015/04/15 Python
django实现分页的方法
2015/05/26 Python
Python单链表简单实现代码
2016/04/27 Python
Python实现简单的四则运算计算器
2016/11/02 Python
python实现计数排序与桶排序实例代码
2019/03/28 Python
python单元测试框架pytest的使用示例
2020/10/07 Python
基于Html5 canvas实现裁剪图片和马赛克功能及又拍云上传图片 功能
2019/07/09 HTML / CSS
Nicole Miller官方网站:纽约女装品牌
2019/09/14 全球购物
软件配置管理有什么好处
2015/04/15 面试题
JPA的特点
2014/10/25 面试题
商务日语毕业生自荐信
2013/11/23 职场文书
业务部主管岗位职责
2014/01/29 职场文书
2014年医院后勤工作总结
2014/12/06 职场文书
实例讲解Python中sys.argv[]的用法
2021/06/03 Python
总结一下关于在Java8中使用stream流踩过的一些坑
2021/06/24 Java/Android
Tomcat执行startup.bat出现闪退的原因及解决办法
2022/04/20 Servers
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL