vue 导出文件,携带请求头token操作


Posted in Javascript onSeptember 10, 2020

前言

本文并不能直接复制到本地看效果,仅提供代码参考

1.使用axios的方式携带请求头token

vue 导出文件,携带请求头token操作

2.设置响应的数据类型

responseType: "blob"

3.请求成功,返回二进制文件的数据回来

vue 导出文件,携带请求头token操作

4.请求失败,返回json

vue 导出文件,携带请求头token操作

5.示例代码

<template>
 <div>
  <el-button type="primary" size="small" :loading="btnLoading" @click="exportFile">导出</el-button>
 </div>
</template>

<script>
import axios from "axios";

export default {
 data() {
  return {
   btnLoading: false
  };
 },
 methods: {
  // responseType 响应类型
  exportFile() {
   this.btnLoading = true;
   axios({
    method: 'get',
    url: '/api',
    headers: {
     token: '79faf82271944fe38c4f1d99be71bc9c'
    },
    responseType: "blob"
   })
    .then(res => {
     this.btnLoading = false;
     if (res.data.type) {
      // 文件下载
      const blob = new Blob([res.data], {
       type: "application/vnd.ms-excel"
      });
      let link = document.createElement('a');
      link.href = URL.createObjectURL(blob);
      link.setAttribute('download', '导出文件.xlsx');
      link.click();
      link = null;
      this.$message.success('导出成功');
     } else {
      // 返回json
      this.$message.warning(res.data.msg);
     }
    })
    .catch(err => {
     this.btnLoading = false;
     this.$message.error("下载失败");
    });
  }
 }
};
</script>

补充知识:Vue项目导出功能、带token导出Excel

在vue后台管理项目中,目前我常用的就两种导出方式

一种是不需要携带token的,直接调用后台的接口,携带需要传递参数就行,具体实现代码如下:

在main.js封装指令

let baseDownloadUrl = 'http://xxxxxxx:8080' // 域名
const PATH = {
	userList:'vue/export/userList' // 后台接口地址
}
// 封装v-out指令
Vue.directive('out', {
	inserted: (el, binding) => {
		el.addEventListener('click', () => {
			console.log(binding.value) // 自定义指令传请求参数
			let a = document.createElement('a') // 创建a标签
			// 处理请求参数,在url后面拼接
			let params = '?'
			for (let key in binding.value.params) {
				params = params + key + '=' + binding.value.params[key] + '&'
			}
			console.log(params)
			a.style.display = 'none'
			// 测试导出文件
			// link.href =	'https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26iid%3D%7BA381F257-9F2F-3652-F0EC-56B9B2C86F92%7D%26lang%3Dzh-CN%26browser%3D4%26usagestats%3D1%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26ap%3Dx64-stable-statsdef_1%26installdataindex%3Dempty/update2/installers/ChromeSetup.exe'
			// a标签添加导出地址
			a.href =
				baseDownloadUrl +
				PATH[binding.value.pathName] +
				putCode +
				(params || '')
			a.setAttribute('download', '文件名') // a标签添加download属性,导出文件名需要就添加,不需要则为空
			document.body.appendChild(a)
			a.click() // 触发a标签点击事件
		})
	}
})

在需要导出的页面应用:

<el-button 
  size="small" type="primary" 
  v-out="{
  pathName: 'userList',
  params: //{请求参数}
}" 
>导出</el-button>

另一种导出方式则是带token导出,token封装在请求头里,在请求头里发送给后端

调用导出接口时,需要加参数:responseType: ‘blob' (必须要有的)

封装导出请求文件exportOut.js

export function expotOut (searchList, pathName, xlsName) {
 // 获取时间,这一步是在下载时文件名带下载日期,例如:用户信息2020-04-27.xls,如无需要可以去掉
 let d = new Date()
 let month = (d.getMonth() + 1)
 let day = d.getDate()
 let time = d.getFullYear() + '-' + (String(month).length > 1 ? month : '0' + month) + '-' + (String(day).length > 1 ? day : '0' + day)
 // 地址
 let baseURL = 'http://xxxxxxx:8080' // 域名
 const PATH = {
  userList:'vue/export/userList', // 后台接口地址
 }
 // 参数
 let params = '?'
 for (let key in searchList) {
  params = params + key + '=' + searchList[key] + '&'
 }
 function createObjectURL (object) { return (window.URL) ? window.URL.createObjectURL(object) : window.webkitURL.createObjectURL(object) }
 var xhr = new XMLHttpRequest()
 var formData = new FormData()
 xhr.open('get', baseURL + PATH[pathName] + params) // url填写后台的接口地址,如果是post,在formData append参数(参考原文地址)
 xhr.setRequestHeader('token', localStorage.getItem('token'))
 xhr.responseType = 'blob'
 xhr.onload = function (e) {
  if (this.status === 200) {
   var blob = this.response
   // xls文件名称
   var filename = `${xlsName}${time}.xls`
   if (window.navigator.msSaveOrOpenBlob) {
    navigator.msSaveBlob(blob, filename)
   } else {
    var a = document.createElement('a')
    var url = createObjectURL(blob)
    a.href = url
    a.download = filename
    document.body.appendChild(a)
    a.click()
    window.URL.revokeObjectURL(url)
   }
  }
 }
 xhr.send(formData)
}

vue文件中使用导出功能:

引入exportOut.js

import { expotOut } from '../http/exportOut'

使用

methods: {
  // 导出
  outFile () {
   expotOut(this.searchList, // 导出请求参数
    'userList', // 后台地址PATH对象的key
    '用户信息'// 导出文件名字
   )
  },
  }

以上这篇vue 导出文件,携带请求头token操作就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery如何实现锚点链接之间的平滑滚动
Dec 02 Javascript
javascript调试之DOM断点调试法使用技巧分享
Apr 15 Javascript
纯Javascript实现ping功能的方法
Mar 20 Javascript
jquery分析文本里url或邮件地址为真实链接的方法
Jun 20 Javascript
Javascript实现图片不间断滚动的代码
Jun 22 Javascript
全面解析标签页的切换方式
Aug 21 Javascript
element 结合vue 在表单验证时有值却提示错误的解决办法
Jan 22 Javascript
Node.js 利用cheerio制作简单的网页爬虫示例
Mar 01 Javascript
移动端图片上传旋转、压缩问题的方法
Oct 16 Javascript
在layui中对table中的数据进行判断(0、1)转换为提示信息的方法
Sep 28 Javascript
Vue微信公众号网页分享的示例代码
May 28 Javascript
微信小程序实现拍照和相册选取图片
May 09 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
Sep 10 #Javascript
jquery实现简单每周轮换的日历
Sep 10 #jQuery
vue循环中点击选中再点击取消(单选)的实现
Sep 10 #Javascript
详解vue父子组件状态同步的最佳方式
Sep 10 #Javascript
vue使用echarts实现水平柱形图实例
Sep 09 #Javascript
在vue中实现清除echarts上次保留的数据(亲测有效)
Sep 09 #Javascript
vue 项目引入echarts 添加点击事件操作
Sep 09 #Javascript
You might like
php中magic_quotes_gpc对unserialize的影响分析
2014/12/16 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
2018/05/11 PHP
获取页面高度,窗口高度,滚动条高度等参数值getPageSize,getPageScroll
2006/09/22 Javascript
如何做到打开一个页面,过几分钟自动转到另一页面
2007/04/20 Javascript
封装的原生javascript弹出层代码
2010/09/24 Javascript
JQuery筛选器全系列介绍
2013/08/27 Javascript
在父页面调用子页面的JS方法
2013/09/29 Javascript
JS实现Fisheye效果动感放大菜单代码
2015/10/21 Javascript
详解Wondows下Node.js使用MongoDB的环境配置
2016/03/01 Javascript
实例讲解JavaScript中的this指向错误解决方法
2016/06/13 Javascript
jQuery插件实现文件上传功能(支持拖拽)
2020/08/27 Javascript
jQuery实现智能判断固定导航条或侧边栏的方法
2016/09/04 Javascript
jQuery得到多个值只能用取Class ,不能用取ID的方法
2016/12/04 Javascript
简单几步实现返回顶部效果
2016/12/05 Javascript
浅谈Angular 观察者模式理解
2018/11/01 Javascript
JS实现的A*寻路算法详解
2018/12/14 Javascript
layui表单验证select下拉框实现验证的方法
2019/09/05 Javascript
python中defaultdict的用法详解
2017/06/07 Python
详解python3中socket套接字的编码问题解决
2017/07/01 Python
Tensorflow之Saver的用法详解
2018/04/23 Python
Python面向对象编程基础实例分析
2020/01/17 Python
python递归调用中的坑:打印有值, 返回却None
2020/03/16 Python
django下创建多个app并设置urls方法
2020/08/02 Python
Python3.7安装PyQt5 运行配置Pycharm的详细教程
2020/10/15 Python
Origins悦木之源英国官网:雅诗兰黛集团高端植物护肤品牌
2017/11/06 全球购物
酒店管理专业毕业生推荐信
2013/11/10 职场文书
艺术设计专业个人求职信范文
2013/12/11 职场文书
满月酒主持词
2014/03/27 职场文书
2014大学生职业生涯规划书最新范文
2014/09/13 职场文书
2014流动人口计划生育工作总结
2014/12/20 职场文书
公证处委托书
2015/01/28 职场文书
八年级英语教学反思
2016/02/15 职场文书
2016年庆祝六一儿童节活动总结
2016/04/06 职场文书
解决MultipartFile.transferTo(dest) 报FileNotFoundExcep的问题
2021/07/01 Java/Android
Win11绿屏怎么办?Win11绿屏死机的解决方法
2021/11/21 数码科技