vue下载文件时文件名中文乱码

时间:2025-02-15 07:53:10

项目场景:

在vue前端调用下载接口时,返回在header的文件名发生乱码问题


问题描述

点击按钮调用下载接口时文件名出现乱码错误

	downloadTemplate() {
      downloadStructureExcelTpl({}).then((res) => {
      let name = headers["content-disposition"]
    .split(";")[1]
    .split("filename=")[1];
        getOutExcel(name, res.data);
      });
    },

原因分析:

在js获取请求头时,会将header解析成其他编码


解决方案:

给出一个convert方法去从header中获取文件名,然后转换成文件中文名称

/**
 * 从blobResponse的请求头获取到文件的名字
 */
export function getFileNameByHeader(headers) {
  let undecodeFileName = headers["content-disposition"]
    .split(";")[1]
    .split("filename=")[1];
  return decodeURIComponent(stringToHex(undecodeFileName));
  function stringToHex(str, joinFlag = "%") {
    let arr = [];
    for (let i = 0; i < str.length; i++) {
      arr[i] = str.charCodeAt(i).toString(16);
    }
    return joinFlag + arr.join(joinFlag);
  }
}
downloadTemplate() {
      downloadStructureExcelTpl({}).then((res) => {
        let name = getFileNameByHeader(res.headers);
        getOutExcel(name, res.data);
      });
    },

2023-07-31新增
解码文件名仅需要
decodeURI(name)即可