【Vue】vue2请求axios后台接口下载Excel表格文件 实战教程

本文介绍了如何使用axios库通过GET请求获取后台导出的Excel数据,并通过Blob对象转换和a标签触发下载,重点在于responseType参数的设置和下载流程的实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

可直接复制代码拿去用 下载Excel表格方法

我参考了两个作者写的 不过最终实现是通过作者1的博文


两个作者链接↓
参考作者1
参考作者2

请求接口需要添加一个参数参数 responseType: 'blob'

export function downProject() {
	return HttpRequest({
		method: 'get',
		url: "/admin/Export/exportProjectTable", //接口地址
		responseType: 'blob',//必须要加 不加的话会出问题 转化失败或者请求乱码 下面的代码都无效
		//服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream',默认是'json'
	})
}
//如果需要参数就在url后面加,我这个没有传参的要求

HttpRequest是什么?我贴一下代码
import HttpRequest from ‘…/axios’

在这里插入图片描述

axios代码如下

import axios from 'axios'
import {
	Notification,
	MessageBox,
	Message
} from 'element-ui'
// import {
// 	baseURL
// } from './config'


axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建axios实例
const service = axios.create({
	// axios中请求配置有baseURL选项,表示请求URL公共部分
	baseURL: '/',
	// baseURL: process.env.VUE_APP_BASE_API,
	// 超时
	timeout: 10000
})
// request拦截器
service.interceptors.request.use(config => {
	// 是否需要设置 token
	const isToken = (config.headers || {}).isToken === false
	// config.headers['Authorization'] = sessionStorage.getItem('token') // 让每个请求携带自定义token 请根据实际情况自行修改
	config.headers['token'] = sessionStorage.getItem('token') // 让每个请求携带自定义token 请根据实际情况自行修改
	// get请求映射params参数
	if (config.method === 'get' && config.params) {
		let url = config.url + '?';
		for (const propName of Object.keys(config.params)) {
			const value = config.params[propName];
			var part = encodeURIComponent(propName) + "=";
			if (value !== null && typeof(value) !== "undefined") {
				if (typeof value === 'object') {
					for (const key of Object.keys(value)) {
						let params = propName + '[' + key + ']';
						var subPart = encodeURIComponent(params) + "=";
						url += subPart + encodeURIComponent(value[key]) + "&";
					}
				} else {
					url += part + encodeURIComponent(value) + "&";
				}
			}
		}
		url = url.slice(0, -1);
		config.params = {};
		config.url = url;
	}
	return config
}, error => {
	console.log(error)
	Promise.reject(error)
})

// 响应拦截器
service.interceptors.response.use(res => {
		// console.log(res, '111');
		return res.data
	},
	error => {
		console.log('err' + error)
		let {
			message
		} = error;
		if (message == "Network Error") {
			message = "后端接口连接异常";
		} else if (message.includes("timeout")) {
			message = "系统接口请求超时";
		} else if (message.includes("Request failed with status code")) {
			// message = "系统接口" + message.substr(message.length - 3) + "异常";
			message = "操作异常"
		}
		Message({
			message: message,
			type: 'error',
			duration: 5 * 1000
		})
		return Promise.reject(error)
	}
)

export default service

上面就是axios.js的代码
具体用法传送门


BLOB (binary large object),二进制大对象,是一个可以存储二进制文件的容器。
blob官网
目的:
后端返回的文件是一个blob格式的流文件,需要前端进行转码,得到一个url,实现下载文件的功能


这是vue页面上点击方法的代码↓
我参考作者1写的,然后我加了点注释

// 点击下载
download() {
	// 可以直接复制拿去用 只需要改请求方法即可
	downProject().then((res) => {
		let blob = new Blob([res], {
		// type: 'application/actet-stream;charset=utf-8'
			type: 'application/vnd.ms-excel'
		}); // 构造一个blob对象来处理数据,并设置文件类型
		let a = document.createElement('a'); // 生成一个a标签
		let href = window.URL.createObjectURL(blob); //创建下载的链接
		a.href = href; //指定下载链接
		a.download = '项目表模板' //指定下载文件名
		// a.setAttribute('download', 'fileName')
		document.body.appendChild(a); //把a标签加到页面中
		a.click(); //触发a标签下载
		document.body.removeChild(a); //下载完成移除元素
		window.URL.revokeObjectURL(href); //释放掉blob对象
	})
},

我看了一下代码有用到生成一个a标签,点击a标签可以触发下载并且不跳转页面

a 标签的 download 属性是 HTML5 标准新增的,作用是触发浏览器的下载操作而不是导航到下载的 url,这个属性可以设置下载时使用新的文件名称。
引用作者说的

下载按钮代码贴图

在这里插入图片描述

下载方法代码贴图

在这里插入图片描述

页面代码
页面贴图

  • 今日份文章 OK
Vue3前端,通过axios库调用后端接口下载Excel文件通常会涉及以下几个步骤: 1. 安装axios库:首先确保已经在项目中安装了axios,如果没有可以运行`npm install axios` 或者 `yarn add axios`。 2. 创建下载链接:后端需要提供一个HTTP响应,该响应应该包含一个名为"Content-Disposition"的头信息,用于指定文件名,并将内容设置为二进制Excel数据。例如,你可以使用`Content-Type: application/vnd.ms-excel`来指定Excel格式。 ```javascript // 假设你的后端API路径是'/api/download-excel' const downloadUrl = '/api/download-excel'; // 使用axios发起GET请求 axios.get(downloadUrl) .then(response => { // 检查响应状态码,一般200表示成功 if (response.status === 200) { // 设置正确的Content-Disposition头信息和Content-Type const filename = 'example.xlsx'; // 文件名 response.headers['Content-Disposition'] = `attachment; filename=${encodeURIComponent(filename)}`; // 创建Blob对象,并创建下载链接 const blob = new Blob([response.data], {type: 'application/vnd.ms-excel'}); const url = URL.createObjectURL(blob); // 创建隐藏的a标签并触发点击事件下载文件 const link = document.createElement('a'); link.href = url; link.download = filename; link.click(); // 清理URL对象 setTimeout(() => URL.revokeObjectURL(url), 0); } else { console.error('Failed to download Excel file.', response); } }) .catch(error => { console.error('Error downloading Excel file:', error); }); ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿民不加班

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值