最近公司专案上刚好碰到制作汇出报表模组开发,而过往我都是透过form submit
方式直接将参回抛给Controller
,但当我列印发生问题时,我无法由前台正确得知我正确的错误讯息为何,因为我的错误讯息只会有一组Default文字。
而这次因为这个模组开发需要支援多国语系,因此在错误讯息方面
我就不能在前端hard code
。我必须依照不同语系转换错误语言跟错误内容。所以就藉此来研究一下该如何透过axios
来下载档案,并回传正确错误讯息。
原文同步发表於个人部落格
下载档案时,Server会回抛资料串流。而一般axios未设定时,预设就为json格式。如果要下载档案就必须在回传型态指
{ responseType: 'blob' }
才能正确接到资料!
// 因为我的回传错误讯息内容的型态是json,所以假使我接到资料是json格式,及代表我汇出发生问题勒
if (res.headers["content-type"].includes("application/json")){
//如果有错误讯息
}
else{
}
{ responseType: 'blob' }
所以我们必须将blob转回json字串,如此才能回抛错误讯息。//1.先宣告取得blob型态
const blb = new Blob([res.data], { type: "json" });
let reader = new FileReader();
//3.完全读完才会进入
reader.onload = e => {
if (e.target.readyState === 2) {
let res = {};
res = JSON.parse(e.target.result);
if (res.Msg.indexOf("app.") !== -1) {
alert(i18n.t(res.Msg));
}
else {
alert(res.Msg);
}
}
};
//2.再将blb型态读出来
reader.readAsText(blb);
const url = window.URL.createObjectURL(new Blob([res.data]));
const link = document.createElement('a');
link.href = url;
//透过decodeURI 将UTF-8转码
const fileName = decodeURI(res.headers["content-disposition"].split(" ")[1].replace("filename*=UTF-8''", ""));
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
axios.post(url, postData, { responseType: 'blob' }).then((res, fileName) => {
if (res.headers["content-type"].includes("application/json")) {
//1.先宣告取得blob型态
const blb = new Blob([res.data], { type: "json" });
let reader = new FileReader();
//3.完全读完才会
reader.onload = e => {
if (e.target.readyState === 2) {
let res = {};
res = JSON.parse(e.target.result);
if (res.Msg.indexOf("app.") !== -1) {
alert(i18n.t(res.Msg));
}
else {
alert(res.Msg);
}
}
};
//2.再将blb型态读出来
reader.readAsText(blb);
}
else {
const url = window.URL.createObjectURL(new Blob([res.data]));
const link = document.createElement('a');
link.href = url;
const fileName = decodeURI(res.headers["content-disposition"].split(" ")[1].replace("filename*=UTF-8''", ""));
link.setAttribute('download', fileName);
document.body.appendChild(link);
link.click();
//document.removeChild('a');
}
}).catch((error) => {
if (error.response) {
alert(error.response.data);
} else {
alert(error.message);
}
});
参考资料:
Convert Blob to String in JavaScript
axios设置responseType===blob导出文件和失败返回json处理
>>: Engineering, Life Cycle Stages, and Processes
本节是以 Golang 上游 4b654c0eeca65ffc6588ffd9c99387a7e4...
今日目标 继续完成批次渲染 结果... 今天抓到一堆bug,但是还是没debug完,被我弄丢的小方块...
测试场景设定 传统的FP Dungeon Crawler(FPDC)撇开玩家的视角,玩家的移动实际上...
在Day5的时候,主要介绍了SELECT语句,在当中也有提及多种资料表合并的语法,这篇文会列出一些简...
当个成功的 工作人! 我一直认为 不要对公司忠诚 公司想要忠诚的人 养只可爱的拉不拉多就好 BUT ...