收藏
回答

Node 获取微信小程序二维码文件流前端展示乱码

API/组件名称 终端类型 微信版本 基础库版本
微信小程序二维码 客户端 iOS 6.6.1 1.7.2

返回文件流无法小程序展示乱码,请官方工程师大神帮忙看看


回答关注问题邀请回答
收藏

9 个回答

  • target
    target
    2020-03-19

    axios发送post请时,指定{ responseType: 'arraybuffer' }即可。

    2020-03-19
    有用 3
    回复 1
    • 你好刺眼!
      你好刺眼!
      2021-12-14
      搞到头大😭 感谢
      2021-12-14
      回复
  • 打了小松鼠
    打了小松鼠
    2020-08-02
    const https = require('https');
    const url = require('url');
    const fs = require('fs');
    
    
    let access_token = 'your token';
    const post_data = JSON.stringify({
        scene: 'a=1',     // 最多32个字符。
        width: 200,     // 生成的小程序码宽度。
    });
    
    
    let options = url.parse(`https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=` + access_token);
    options = Object.assign(options, {
        method: 'POST',
        headers: {
            'Content-Type''application/json',
            'Content-Length': post_data.length,
        }
    });
    
    
    // 获取图片二进制流
    let imgBuffer;
    const xxx = function () {
        return new Promise((resolve, reject) => {
            let req = https.request(options, (res) => {
                let resData = '';
                res.setEncoding("binary");
                res.on('data'data => {
                    resData += data;
                });
                res.on('end'() => {
                    const contentType = res.headers['content-type'];
                    imgBuffer = Buffer.from(resData, 'binary');
                    resolve({ imgBuffer, contentType });
                });
            });
            req.on('error'(e) => {
                console.log('获取微信小程序图片失败')
                console.error(e);
            });
            req.write(post_data);   
            req.end();
        }).catch(() => {
            return null;
        });
       
    }
    
    
    xxx().then((xx)=>{
        fs.writeFile('./www/static/genCode.jpeg', imgBuffer, function (err{
            if (err) {
                console.log(err)
            }
        });
    });
    
    
    //改下自己的access_token,可以用
    
    2020-08-02
    有用 2
    回复 1
    • iCan
      iCan
      2022-02-06
      res.setEncoding("binary");
      Buffer.from(resData, "binary");
      是关键啊
      2022-02-06
      回复
  • 未来可期
    未来可期
    2018-02-02

    可以把接口返回的小程序二维码文件流转换成base64格式(base64.b64encode(res.body)),然后加上头信息"data:image/jpeg;base64,", 传给前端图片的src。


    2018-02-02
    有用
    回复
  • 棉花糖
    棉花糖
    2018-01-18

    请问解决了吗?@楼主,

    我也是用nodejs开发,同样返回乱码,不管是utf8或者gbk解码在保存图片都不行。

    2018-01-18
    有用
    回复
  • 闫峰
    闫峰
    2018-01-18

    楼主,怎么解决的?

    2018-01-18
    有用
    回复
  • 闫峰
    闫峰
    2018-01-18

    这个问题怎么解决的?我也遇到了同样的问题

    下面的代码可以保存生成的二维码图片,但打不开,不论是jpg,png,jpeg都不行

    const createCodeBar = co(function* (){

    const postRequest = promisify(request.post, { multiArgs: true,'json': true });

    let token = 'h3-Oda1A05Nit6EEZEkFqvgemQPCpRj1rmwYCp3puMahUH_a4rMXbYlS2NoMsjYiVhci0uDbe-VNlQAui1Ljp-fyFi8PqrGYZEsUMA0G88xmob-fheZ2c_85Jw8tnMx-NFSbAHACUH';
    console.log('token:' + token);
    let form = {
    'path':'page/bookflow/pages/sharegroup/sharegroup?groupId=279&introducer=1686&fromBarcode=true'
       }
    form = JSON.stringify(form);
    console.log(form);
    let result= yield postRequest({url:'https://api.weixin.qq.com/wxa/getwxacode?access_token=' + token,form:form});

    fs.writeFile('d:/mybar.png', result[0].body, function(err) {
    if (err) {
    console.log('出现错误!')
    }
    });
    console.log('result:' + result[1]);

    })


    2018-01-18
    有用
    回复
  • Archer
    Archer
    2018-01-14

    获取后,直接通过流上传到七牛之类的云端存储服务,获取Key后再前端显示。

    2018-01-14
    有用
    回复
  • Justin
    Justin
    2018-01-12

    'Content-Type': 'Content-type: image/jpg'

    我试过不行苏晓光 

    2018-01-12
    有用
    回复
  • 苏晓光
    苏晓光
    2018-01-11

    Content-Type 设置图片

    2018-01-11
    有用
    回复
登录 后发表内容