zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    取得窗口大小和窗口位置兼容所有浏览器的js代码
    一个简单易用的导出Excel类
    如何快速启动chrome插件
    网页表单设计案例
    Ubuntu下的打包解包
    The source file is different from when the module was built. Would you like the debugger to use it anyway?
    FFisher分布
    kalman filter
    Group delay Matlab simulate
    24位位图格式解析
  • 原文地址:https://www.cnblogs.com/yalong/p/14766064.html
Copyright © 2011-2022 走看看