文章原文:https://www.cnblogs.com/yalong/p/14766064.html
故事背景:
前端接口全部通过node层做的转发,之前都是get post 等常见接口的转发,后来来了一个下载的接口,node层转发后,前端下载总是乱码,文件打不开,经过各种查询才解决,在此做个总结
先了解下,二进制文件流,从java后端,没有经过node转发,直接到前端页面,然后下载到本地的整个流程
前端通过axios 请求下载接口,接口返回的其实是二进制文件,前端无法处理,可以把 axios 的 responseType 设置为blob, 这样就可以直接拿到二进制文件转化成的Blob, 然后对Blob处理下,就可以下载,具体代码如下:
let result = await axios.request({
method: method,
url: url,
data: req.body,
responseType: 'blob'
});
// 这里是转成 .xlsx 格式的文件
let blob = new Blob([result.data], {
type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
});
let blobHref = window.URL.createObjectURL(blob);
let anchor = document.createElement('a');
anchor.href = blobHref;
anchor.download = '文件名字';
document.body.appendChild(anchor);
anchor.click();
window.URL.revokeObjectURL(blobHref);
document.body.removeChild(anchor);
回到 我们在node层 转发的问题,在node层其实也要用axios请求一次java后端的下接口,但是axios请求, 或者说 XMLHttpRequest 本身的 responseType, 默认是DOString, 在node层转发的时候,我们想要的效果,是请求到二进制流,并把这个二进制流直接返给前端,这时候,就是对responseType进行设置了
如果不设置arraybuffer,前端拿到的就是二进制流转成DOMString的结果了,就是个乱码
responseType 的值
值 | 数据类型 |
---|---|
'' | DOMString (这个是默认类型) |
arraybuffer | ArrayBuffer对象 |
blob | Blob对象 |
document | Document对象 |
json | JavaScript object, parsed from a JSON string returned by the server |
text | DOMString |
在node端用axios请求的时候,需要把responseType 设置成 arraybuffer,arraybuffer 就 二进制数据缓冲区,可以用来保存二进制文件流
代码如下:
router.all('/', async (ctx, next) => {
const req = ctx.request;
let url = req.url;
const method = req.method;
let result = await axios.request({
method: method,
url: url,
data: req.body,
responseType: 'arraybuffer'
});
下面这行不用加, koa2 会自动加上的
// ctx.set('Content-Type', 'application/octet-stream');
ctx.body = result.data;
});
这样前端就可以按照跟请求java接口的方式,请求node层暴露出来的接口了。
参考链接: