想问下后端下载接口返回了文件,为啥用 js 转 blob 后打不开了...

2020-04-14 15:22:31 +08:00
 xiaohantx

3384 次点击
所在节点    JavaScript
24 条回复
xiaohantx
2020-04-14 15:25:09 +08:00
看搜出来的 blob 那里是[res.data]这里在 request.js 文件封装取过了,应该只要拿 res 就好了吧
yaphets666
2020-04-14 15:27:51 +08:00
res.data
yidinghe
2020-04-14 15:28:16 +08:00
打不开是怎么个打不开法,把 blob 内容导出来,重命名为 .xlsx,然后试试。
littleylv
2020-04-14 15:28:54 +08:00
为什么不是 res.data
xiaohantx
2020-04-14 15:31:41 +08:00
@yaphets666
@littleylv
res 就是我图二的 data 内容了,还需要 res.data 嘛,封装过了
service.interceptors.response.use(
response => {
console.log(response)
if (response.headers.password) {
return response.headers.password
} else {
return response.data
}
})
xiaohantx
2020-04-14 15:32:59 +08:00
@yidinghe 返回的是乱码不知道怎么导出,直接用 blob 下载嘛,![]( https://cdn.markone.xyz/images/20200414153255.png)
yaphets666
2020-04-14 15:33:23 +08:00
type 换这个试试"application/vnd.ms-excel"
xiaohantx
2020-04-14 15:33:46 +08:00
rming
2020-04-14 15:35:42 +08:00
为甚么不用 location.href 跳转过去下载。。
xiaohantx
2020-04-14 15:36:57 +08:00
@yaphets666 直接打开下的是 xlsx 格式的是能打开的,对照 MIME 表这个是 xls 吧,不过试了下也不可以
xiaohantx
2020-04-14 15:37:23 +08:00
@rming 因为下载文件的时候后端要求带上 token.....直接跳过去貌似没办法 header 带
crz
2020-04-14 15:38:21 +08:00
@xiaohantx 对比下文件
xiaohantx
2020-04-14 15:39:27 +08:00
@crz 可以看下 6 楼图,因为 blob 后文件打不开所以对比大小由几十 kb 增加到了几百 kb
zjsxwc
2020-04-14 15:44:52 +08:00
你这个 PK 开头的文件是 zip 文件吧,确定是直接返回 excel 文件?
yaphets666
2020-04-14 15:44:58 +08:00
不会没写 responseType 吧?
xiaohantx
2020-04-14 15:46:18 +08:00
@zjsxwc 但是我直接访问接口地址是下下来的 excel 文件
littleylv
2020-04-14 15:46:30 +08:00
是不是后端返回的数据不是 blob 而是 dataurl ?
var dataURLtoBlob = function(dataurl) {
var arr = dataurl.split(','), mime = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);
while(n--){
u8arr[n] = bstr.charCodeAt(n);
}
return new Blob([u8arr], {type:mime});
};
转一下试试?
xiaohantx
2020-04-14 15:54:02 +08:00
zjsxwc
2020-04-14 15:54:02 +08:00
@xiaohantx 哦 OOXML 就是 zip 的 excel
试试 转 u8 数组

var n, bstr, u8arr;
bstr = res;
n = bstr.length;
u8arr = new Uint8Array(n);
while (n--) {
u8arr[n] = bstr.charCodeAt(n);
}
var blob = new Blob([u8arr], "hello.xlsx", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
Latin
2020-04-14 15:54:44 +08:00
https://paste.ubuntu.com/p/NPwXWtvgky/
特地找了下之前的代码
后端返回是 Content-Type=application/octet-stream

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/662302

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX