前端取Content-Disposition中的filename字段与解码(vue)

server/2024/12/28 2:48:37/

前言

这个需求其实是根据导出文件来的,导出文件后,后端将文件名存储到请求头中的headers里了,那么前端需要从headers里的Content-Disposition里面取到并解码。

第一步:新增getFileRequest.js

因为涉及到拿去接口中的headers中数据,为了避免修改全局的request.js文件而引发的一系列问题,我新建了一个一个新的request.js叫getFileRequest.js专门处理关于文件上传的问题。具体内容如下(vue2):

javascript">import axios from 'axios'
import { MessageBox, Message } from 'element-ui'
import store from '@/store'
import { getToken, setToken } from '@/utils/auth'// create an axios instance
const service = axios.create({baseURL: process.env.VUE_APP_BASE_API, // url = base url + request url// withCredentials: true, // send cookies when cross-domain requeststimeout: 1000* 60* 5 // request timeout
})// request interceptor
service.interceptors.request.use(config => {// do something before request is sent   && !config.noFormif (config.data) {const dataForm = new FormData()for (const key in config.data) {dataForm.append(key, config.data[key])}config.data = dataForm}// =====if (getToken()) {config.headers['Authorization'] = getToken()}return config},error => {// do something with request errorconsole.log(error) // for debugreturn Promise.reject(error)}
)// response interceptor
service.interceptors.response.use(response => {// token存储const { headers, request: { responseURL } } = responseif (responseURL.includes('auth/login')) {store.dispatch('user/changeSomething', { token: headers.authorization })setToken(headers.authorization)}// ============const res = responsereturn res},error => {console.log(error);console.log('err' + error) // for debugMessage({message: error.message,type: 'error',duration: 5 * 1000})return Promise.reject(error)}
)export default service

主要修改部分其实就一处,就是在service.interceptors.response.use里面
返回的res是全部信息,而不是res.data

第二步:对返回数据进行请求头的获取与解码

这里我截取一部分代码

javascript">async exportTemplate(bizCode) {this.loading = true;try {const res = await this.$api.xxx({xxx},{responseType: 'blob' // 确保响应类型为 blob});const contentDisposition = res?.headers['content-disposition'];let fileName = '模板.xlsx'; // 默认文件名if (contentDisposition && contentDisposition.indexOf('fileName=') !== -1) {// 解码文件名fileName = decodeURIComponent(contentDisposition.split('fileName=')[1].replace(/['"]/g, ''));}const link = document.createElement("a");let blob = new Blob([res.data]);link.style.display = "none";link.href = URL.createObjectURL(blob);link.setAttribute("download", fileName);document.body.appendChild(link);link.click();document.body.removeChild(link);} catch (e) {console.log(e);} finally {this.loading = false;}

首先我通过调用res?.header['content-disposition']获取到全部的content-disposition信息,然后再判断这个信息是否存在且能捕获到fileName,如果存在且能够捕获到,那么进行文件名的解码,具体用的就是decodeURIComponent。最终实现。


http://www.ppmy.cn/server/153254.html

相关文章

IBatis与MyBatis的区别

iBatis 和 MyBatis 都是优秀的持久层框架,它们都提供了对象关系映射(ORM)的功能,允许开发者将 Java 对象映射到数据库表。MyBatis 是 iBatis 的后继者,由同一个团队开发。以下是 iBatis 与 MyBatis 之间的一些主要区别…

常见网络攻击场景常被用于测试系统安全性

常见网络攻击场景常被用于测试系统安全性 在区块链系统中,以下网络攻击场景常被用于测试系统安全性: 51% 攻击 攻击原理:当一个或一组攻击者控制了超过全网 50%的算力时,就有可能操纵区块链的账本记录。在工作量证明(PoW)机制下,攻击者可以通过算力优势,实现对新区块的…

学会python+unittest框架打造高效自动化测试

前言 在软件开发领域,测试是确保软件质量、稳定性和用户满意度的重要环节。随着软件项目的日益复杂,传统的手动测试方法已难以满足快速迭代和持续交付的需求。因此,自动化测试框架成为了现代软件开发不可或缺的工具。本文将为您详细介绍Pyth…

C项目 天天酷跑(下篇)

上篇再博客里面有&#xff0c;接下来我们实现我们剩下要实现的功能 文章目录 碰撞检测 血条的实现 积分计数器 前言 我们现在要继续优化我们的程序才可以使这个程序更加的全面 碰撞的检测 定义全局变量 实现全局变量 void checkHit() {for (int i 0; i < OBSTACLE_C…

ELK系列-(六)Redis也能作为消息队列?(下)

一、前文回顾 &#x1f50d; 在前面的ELK系列中&#xff0c;我们已经搭建了ELK的核心组件&#xff0c;包括&#xff1a; ELK系列-&#xff08;一&#xff09;Docker部署ELK核心组件ELK系列-&#xff08;二&#xff09;LogStash数据处理的瑞士军刀ELK系列-&#xff08;三&…

【提审】Android包提审报权限问题

问题&#xff1a;华为应用市场审核不通过 平台审核检测详情&#xff1a; 日志&#xff1a; 自检工具&#xff1a;frida-server【Unity&Android】安卓app自测应用隐私相关获取和申请权限_apk 隐私合规 自测-CSDN博客 参考资料&#xff1a;Unity启动时获取了android_id等设…

机器学习之scikit-learn(简称 sklearn)

scikit-learn&#xff08;简称 sklearn&#xff09;是 Python 生态中一个非常流行且强大的机器学习库&#xff0c;支持各种机器学习算法和工具。 核心模块和功能 监督学习 (Supervised Learning)&#xff1a; 分类 (Classification): 支持的算法&#xff1a;KNN、SVM、决策树、…

生成式AI:药学科普的新引擎

在信息爆炸的时代&#xff0c;药学知识的普及显得尤为重要。而今&#xff0c;生成式人工智能&#xff08;Generative AI&#xff09;正以其强大的内容生成和数据分析能力&#xff0c;悄然改变着传统的药学科普模式。它不仅能加速信息的传递&#xff0c;更能为患者提供个性化、易…