Mock下载Excel文件损坏

最近在开发中遇到一个奇葩的问题,下载 Excel,文件可以成功下载,但是无法打开(文件损坏)。此处仅记录一下,以便后面再遇到相同的问题。

这里先说结论,在下载 blob 文件时,不能使用 mock.js。

本来下载一个二进制流文件,在日常的开发中很常见。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
axios({
...
// 这一行是关键
responseType: 'blob'
}).then(res => {
const blob = new Blob([res.data], {type: 'application/vnd.ms-excel'});
const href = window.URL.createObjectURL(blob); //创建下载的链接
const a = document.createElement('a');
a.href = href;
a.download = '导出文件.xls'; // 下载后文件名
document.body.appendChild(a));
a.click();
document.body.removeChild(a); //下载完成移除元素
window.URL.revokeObjectURL(href); //释放掉blob对象
})

但是下载下来的文件却无法打开,然后一度怀疑是编码的问题。尝试了各种打开方式,都不能打开,但是单独打开却可以下载。

我甚至想要直接在新 tab 页中打开下载链接了(这是 get 请求)。然后试着移除 mock.js,成功了!

后面才发现 mock 会拦截所有的请求,匹配规则的就使用模拟数据,不匹配的也会使用封装后的 request 请求后台。所以这样会导致下载的文件流损坏。

[越努力,越幸运!]