node层用koa2转发java后端文件下载接口

文章原文: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层暴露出来的接口了。

参考链接:

https://segmentfault.com/a/1190000023731567

https://www.cnblogs.com/x123811/p/11428027.html

原文地址:https://www.cnblogs.com/yalong/p/14766064.html