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

  • 相关阅读:
    [freemarker篇]03.如何处理空值
    [Android篇]Android Studio + Genymotion 一夜无眠 ,超级详细版本[请使用新版2.0]
    [freemarker篇]02.生成HTML的静态页面
    [freemarker篇]01.入门Freemarker示例
    验证码-直接使用
    jquery基础介绍-转
    VBA与宏
    .net打印
    [CCF] 201612-1 中间数
    [LeetCode] 56. Merge Intervals(vector sort)
  • 原文地址:https://www.cnblogs.com/yalong/p/14766064.html
Copyright © 2011-2022 走看看