本文已参与「新人创作礼」活动,一起开启掘金创作之路。
前言
开发后台管理系统时,难免会涉及到文件的导出。现在后端导出文件主要采用“二进制文件流”的形式来让前端导出文件。上传主要方式有以下方式:
- 从后台API获取二进制流文件地址,进行处理
- 配置前端请求方式,以 blob的方式请求获取文件流
文件导出失败
解决方案: 1.设置头部 2.接受blob流
headers["Content-Type"] = "application/x-www-form-urlencoded; charset=utf-8"
headers["responseType"] = "blob"
导出文件流+文件名乱码
文件名可以自己起或者后端传过来的转一下
//导出
if (response.config && response.config.responseType == "blob") {
// const excelUrl = window.URL.createObjectURL(new Blob([response.data]));
// const link = window.document.createElement('a');
let fileName = (response.headers['content-disposition'].split('filename="')[1]).split('"')[0]; // 文件名
//对文件名乱码转义--【Node.js】使用iconv-lite解决中文乱码
let iconv = require('iconv-lite');
iconv.skipDecodeWarning = true; //忽略警告
fileName = iconv.decode(fileName, 'UTF-8');
// link.href = response.data;
// link.download = fileName;
// document.body.appendChild(link); // 兼容FireFox
// link.click();
// window.URL.revokeObjectURL(excelUrl);
// link.remove(); // 兼容FireFox
let blob = new Blob([response.data], {
type: "application/vnd.ms-excel"
});
let elink = document.createElement('a');
elink.download = fileName;
elink.style.display = 'none';
elink.target = "_blank";
elink.href = URL.createObjectURL(blob);
document.body.appendChild(elink);
elink.click();
URL.revokeObjectURL(elink.href); // 释放URL对象
document.body.removeChild(elink);
}
导出失败的时候 blob流 转 json
if (error.response.config && error.response.config.responseType == "blob") {
//导出失败
let reader = new FileReader();
reader.readAsText(error.response.data, 'utf-8');
reader.onload = (e) => {
console.log("----", JSON.parse(reader.result));
console.log("----", JSON.parse(e.target.result));
Message({
message: JSON.parse(reader.result).msg || JSON.parse(e.target.result).msg,
type: 'error',
offset: 30,
duration: 5 * 1000,
})
}
return
}