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 相关文章推荐
js加减乘除丢失精度问题解决方法
May 16 Javascript
JS实现定时自动关闭DIV层提示框的方法
May 11 Javascript
浅谈javascript构造函数与实例化对象
Jun 22 Javascript
12种JavaScript常用的MVC框架比较分析
Nov 16 Javascript
解决jquery无法找到其他父级子集问题的方法
May 10 Javascript
ionic js 复选框 与普通的 HTML 复选框到底有没区别
Jun 06 Javascript
Bootstrap简单表单显示学习笔记
Nov 15 Javascript
浅谈Vue.js
Mar 02 Javascript
angularjs下拉框空白的解决办法
Jun 20 Javascript
使用JS实现导航切换时高亮显示的示例讲解
Aug 22 Javascript
javascript中UMD规范的代码推演
Aug 29 Javascript
vue项目中引入Sass实例方法
Aug 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 第二节 数据类型之数值型
2012/04/28 PHP
PHP中空字符串介绍0、null、empty和false之间的关系
2012/09/25 PHP
基于MySQL分区性能的详细介绍
2013/05/02 PHP
php/js获取客户端mac地址的实现代码
2013/07/08 PHP
利用phpexcel把excel导入数据库和数据库导出excel实现
2014/01/09 PHP
纯PHP生成的一个树叶图片画图例子
2014/04/16 PHP
PHP实现简单搜歌的方法
2015/07/28 PHP
php curl批处理实现可控并发异步操作示例
2018/05/09 PHP
判断JavaScript对象是否可用的最正确方法分析
2008/10/03 Javascript
如何确保JavaScript的执行顺序 之jQuery.html深度分析
2011/03/03 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
jquery防止重复执行动画避免页面混乱
2014/04/22 Javascript
常见浏览器多长时间会提示“脚本运行时间过长”总结
2014/04/29 Javascript
javascript笛卡尔积算法实现方法
2015/04/08 Javascript
JavaScript实现鼠标滑过处生成气泡的方法
2015/05/16 Javascript
浅析JavaScript作用域链、执行上下文与闭包
2016/02/01 Javascript
详解Node.js模块间共享数据库连接的方法
2016/05/24 Javascript
详解vue组件化开发-vuex状态管理库
2017/04/10 Javascript
浅谈Vue父子组件和非父子组件传值问题
2017/08/22 Javascript
ES6中Array.copyWithin()函数的用法实例详解
2017/09/16 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
解决vue-cli项目开发运行时内存暴涨卡死电脑问题
2019/10/29 Javascript
JS实现商城秒杀倒计时功能(动态设置秒杀时间)
2019/12/12 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
HTML5 Canvas实现文本对齐的方法总结
2016/03/24 HTML / CSS
用html5的canvas画布绘制贝塞尔曲线完整代码
2013/08/14 HTML / CSS
同步和异步有何异同,在什么情况下分别使用他们?举例说明
2014/02/27 面试题
单位未婚证明范本
2014/01/18 职场文书
恐龙的灭绝教学反思
2014/02/12 职场文书
领导调研接待方案
2014/02/27 职场文书
团日活动总结书
2014/05/08 职场文书
金融系应届毕业生求职信
2014/05/26 职场文书
最美乡村医生事迹材料
2014/06/02 职场文书
教师党员个人剖析材料
2014/09/29 职场文书
党的群众路线教育实践活动党员个人剖析材料
2014/10/08 职场文书
辩论赛新闻稿
2015/07/17 职场文书