Vue Excel 文件流导出乱码快速解决方案

ops/2024/10/25 17:20:57/

今日在开发一个导出功能,原本一个非常简单的功能,却没想里面藏了陷阱!

背景

前端导出的文件流乱码,此时确定非后端问题(可以在postman导出是否正常来判断)。

前端导出:

后端正常数据:

答疑

第一,如果你要做一个导出功能(后端返回的数据位文件流),那接口可能是类似的结构

红框为必不可少的参数,且与其他参数同级,如“data”,“headers”等,如果你没有,那“还没开始就已经结束了”。

第二,前端导出代码可能是类似的结构,网上代码大同小异

对于红框部分,我在测试导出的过程中, 有跟没有乱码结果是一样的,因为这个不是决定性因素(前提是后端返回的数据为utf-8格式的文件流)。

以上两点,在后端返回正常的文件流情况下,前端导出基本是没什么问题的。

但是!如果此时你导出的文件还是出现了乱码,那就需要更深入排查了。

在参考了大部分对于该问题的应对文章后,我总算是找到了解决方案!

深入排查

首先,排查返回的数据响应头数据结构,可在响应拦截器中打印出来,查看“request”中的“response”与“responseType”

如果出现了以上情况,“responseType”是空的,“response”(即“data”)不是blob对象而是一个字符串,这就有问题了。 

正常来说,前端响应接收到应该是一个blob对象,类似

针对这个问题,我排查了蛮久,明明自己在请求接口加了参数 responseType: 'blob'

为啥响应体该字段是空?且返回数据不是blob对象?

在参考了多篇博客,经过仔细排查之后,发现一个问题,就是我项目中使用了“mock”,没错,就是可以劫持请求的那个“mock”!也正是因为它,将我的“responseType”置空!如下:

vue.config.js 配置:

(此时process.env.VUE_APP_BUILD_MODE不是“nomock”,导致使用“mock”)

mock 配置:

(此时responseType: ' ',)

我尝试把使用“mock”的地方注释掉:

重启,导出,成功!!!

响应体也不吃意外的同步

总结

1、请求参数 responseType: 'blob'

2、new Blob([res], {type:"application/vnd.ms-excel;charset=UTF-8"})

3、移除“mock”,避免对请求进行劫持从而影响参数


http://www.ppmy.cn/ops/41560.html

相关文章

量化交易:Dual Thrust策略

哈喽,大家好,我是木头左! Dual Thrust策略起源于20世纪80年代,由美国著名交易员和金融作家Larry Williams首次提出。这一策略的核心思想是通过捕捉市场中的短期波动来实现盈利。Larry Williams通过多年的研究和实践,发…

Alembic 的使用(配合一款免费云数据库MemfireDB)

已经使用 Go 开发好一段时间了,最近因为工作原因又重操旧业搞起了 Python,基于 FastAPI 进行接口开发,然后去找了一下相关的脚手架,发现这其中挺多都用到了 Alembic,之前没使用过,于是学习了一下&#xff0…

20240514基于深度学习的弹性超材料色散关系预测与结构逆设计

论文:Dispersion relation prediction and structure inverse design of elastic metamaterials via deep learning DOI:https://doi.org/10.1016/j.mtphys.2022.100616 1、摘要 精心设计的超材料结构给予前所未有的性能,保证了各种各样的具…

Linux监听某个进程,自动重启

文章目录 前言一、使用 bash 脚本编写监控程序二、使用 systemd总结 前言 在 Linux 下监听某个进程,当进程异常退出后自动重启,可以使用bash脚本编写监控程序,也可以使用系统工具如 systemd 或 supervisor。 一、使用 bash 脚本编写监控程序…

训练集、测试集与验证集:机器学习模型评估的基石

在机器学习中,为了评估模型的性能,我们通常会将数据集划分为训练集(Training Set)、验证集(Validation Set)和测试集(Test Set)。这种划分有助于我们更好地理解模型在不同数据上的表…

C++复习 -- 继承

继承基本概念 继承是面向对象编程(OOP)中的一个核心概念,特别是在C中。它允许一个类(称为派生类或子类)继承另一个类(称为基类或父类)的属性和方法。 继承的主要目的是实现代码重用&#xff0…

thinkphp8扩展think-swoole4.0-事件监听代码

首先服务端配置监听 swoole.php <?phpreturn [http > [enable > true,host > 0.0.0.0,port > 8000,worker_num > swoole_cpu_num(),options > [],],websocket > [enable > true,handler > \think\swo…

Mac电脑安装打开APP显示问题已损坏 问题解决

当MAC电脑安装完软件打开时&#xff0c;显示文件已损坏&#xff0c;无法打开。搜了很多教程终于找到解决方案&#xff0c;记录下方便以后再用。 我的mac电脑是intel芯片的&#xff0c;如果你遇到这个问题&#xff0c;可以参考我的这个方案。 1.首先当打开软件后出现 “xx软件已…