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 UI 实现email输入提示实例
Aug 15 Javascript
js 绑定键盘鼠标事件示例代码
Feb 12 Javascript
jquery 操作css样式、位置、尺寸方法汇总
Nov 28 Javascript
JS实现超精简的链接列表在固定区域内滚动效果代码
Nov 04 Javascript
使用postMesssage()实现iframe跨域页面间的信息传递
Mar 29 Javascript
很棒的js选项卡切换效果
Jul 15 Javascript
AngularJS ng-bind-html 指令详解及实例代码
Jul 30 Javascript
JQueryEasyUI框架下的combobox的取值和绑定的方法
Jan 22 Javascript
详谈jQuery中使用attr(), prop(), val()获取value的异同
Apr 25 jQuery
JS函数动态传递参数的方法分析【基于arguments对象】
Jun 05 Javascript
ES6 Class中实现私有属性的一些方法总结
Jul 08 Javascript
JavaScript实现通讯录功能
Dec 27 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三元运算的2种写法代码实例
2014/05/12 PHP
分享微信扫码支付开发遇到问题及解决方案-附Ecshop微信支付插件
2015/08/23 PHP
浅谈Yii乐观锁的使用及原理
2017/07/25 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
javascript中使用css需要注意的地方小结
2010/09/01 Javascript
js最简单的拖拽效果实现代码
2010/09/24 Javascript
最简单的js图片切换效果实现代码
2011/09/24 Javascript
js 幻灯片的实现
2011/12/06 Javascript
javascript:window.open弹出窗口的位置问题
2014/03/18 Javascript
js函数调用的方式
2014/05/06 Javascript
jquery统计用户选中的复选框的个数
2014/06/06 Javascript
JavaScript 里的类数组对象
2015/04/08 Javascript
JavaScript浏览器对象之一Window对象详解
2016/06/03 Javascript
浅析Bootstrap表格的使用
2016/06/23 Javascript
EditPlus中的正则表达式 实战(4)
2016/12/15 Javascript
laravel5.4+vue+element简单搭建的示例代码
2017/08/29 Javascript
Angular 开发学习之Angular CLI的安装使用
2017/12/31 Javascript
vue中设置height:100%无效的问题及解决方法
2018/07/27 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
Vue-不允许嵌套式的渲染方法
2018/09/13 Javascript
vue2过滤器模糊查询方法
2018/09/16 Javascript
JavaScript监听触摸事件代码实例
2019/12/30 Javascript
js实现表单项的全选、反选及删除操作示例
2020/06/05 Javascript
如何搜索查找并解决Django相关的问题
2014/06/30 Python
python使用PyGame播放Midi和Mp3文件的方法
2015/04/24 Python
基于python中theano库的线性回归
2018/08/31 Python
django模板结构优化的方法
2019/02/28 Python
Pytorch 多块GPU的使用详解
2019/12/31 Python
利用CSS3实现折角效果实例源码
2016/09/28 HTML / CSS
html5中 media(播放器)的api使用指南
2014/12/26 HTML / CSS
医院义诊活动总结
2014/07/04 职场文书
新课培训心得体会
2014/09/03 职场文书
群众路线教育实践活动方案
2014/10/31 职场文书
2014年驾驶员工作总结
2014/11/18 职场文书
悬空寺导游词
2015/02/05 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书