DylanJi
DylanJi
  • 发布:2019-02-27 17:14
  • 更新:2023-07-05 17:20
  • 阅读:9197

uni.request 中responseType设置为arraybuffer在安卓上无效

分类:uni-app

具体代码为:
uni.request({
url:"",
method:"GET",
dataType:"arraybuffer",
responseType:"arraybuffer", // 一定要设置为二进制的模式
success:(res)=>{

                }  
            });  

其中服务器传输回来的是一个流文件,我在网页上调试没有问题,在安卓上,拿到的数据还是以String模式呈现的,这样我就没法解析了。有什么办法解决?

2019-02-27 17:14 负责人:无 分享
已邀请:

最佳回复

DCloud_uni-ad_HDX

DCloud_uni-ad_HDX

已确认在app中有问题 可以先尝试通过下面的方法来解决

var StreamBinaryString = function(s) {  
    this._p = 0;  
    this._s = this.fromBinaryString(s);  
};  
StreamBinaryString.prototype = {  
    constructor: StreamBinaryString,  

    fromBinaryString(e) {  
        var t = e || '';  
        var f = [];  
        for (var i = 0; i < t.length; i++) {  
            f[i] = String.fromCharCode(t.charCodeAt(i) & 255);  
        }  
        return f.join('');  
    },  

    read: function(array, offset, count) {  
        if (arguments.length == 1) {  
            var result = this._s.substr(this._p, array);  
            this._p += array;  
            return result;  
        } else {  
            var result = 0;  
            for (var i = 0; i < count; i++) {  
                array[i] = this._s.charCodeAt(this._p);  
                this._p += 1;  
                result++;  
            }  
            return result;  
        }  
    },  

    readByte: function() {  
        var result = this._s.charCodeAt(this._p);  
        this._p += 1;  
        return result;  
    },  

    readInt8: function(signed) {  
        var result = this._s.charCodeAt(this._p);  
        if (signed && result > 127) {  
            result -= 256;  
        }  
        this._p += 1;  
        return result;  
    },  

    readInt16: function() {  
        var result = ((this._s.charCodeAt(this._p) << 8) + this._s.charCodeAt(this._p + 1));  
        this._p += 2;  
        return result;  
    },  

    readInt32: function() {  
        var result = ((this._s.charCodeAt(this._p) << 24) + (this._s.charCodeAt(this._p + 1) << 16) + (this._s.charCodeAt(  
            this._p + 2) << 8) + this._s.charCodeAt(this._p + 3));  
        this._p += 4;  
        return result;  
    },  

    eof: function() {  
        return this._p >= this._s.length;  
    }  
};  
  • DylanJi (作者)

    感谢您的回复,请问下readInt8的函数中,参数 t 是什么?我在使用的时候该传什么值进去?

    2019-04-02 20:51

  • DCloud_uni-ad_HDX

    回复 DylanJi:已修改代码,看上去比较好理解些了,int8与uint8的区别

    2019-04-03 10:35

  • DylanJi (作者)

    回复 DCloud_uni-ad_HDX:感谢您的回复,不过还是有问题,我自己试了下,如果传过来的数据里Array里面,数值大于127的话,好像charCodeAt返回的值就成了65533这样很大的数值。还是希望可以尽快修复这个bug

    2019-04-03 12:34

  • DCloud_uni-ad_HDX

    回复 DylanJi:我上面补充了一个函数,先转下试试

    2019-04-03 12:56

  • DylanJi (作者)

    回复 DCloud_uni-ad_HDX:好的,感谢

    2019-04-04 10:38

  • 4***@qq.com

    你好 有没有示例。我也遇到这个问题了,需要把二进制流转成arraybuffer

    2019-04-12 12:25

DCloud_uni-ad_HDX

DCloud_uni-ad_HDX

示例

uni.request({  
    url: "https://dcloud.io/html5video/xiangeiailisi3.mid",  
    method: "GET",  
    dataType: "arraybuffer",  
    responseType: "arraybuffer",  
    success: (res) => {  
        var stream = new StreamBinaryString(res.data);  
        console.log("readByte: " + stream.readByte());  
        console.log("readByte: " + stream.readByte());  
        console.log("readByte: " + stream.readByte());  
        console.log("readByte: " + stream.readByte());  
    }  
});
  • 4***@qq.com

    我的是个图片流 就是图形验证码,转成arraybuffer之后还得弄成base64,这个好像不行哦

    2019-04-12 15:02

  • 1***@qq.com

    回复 4***@qq.com: 你好,你的问题最后怎么解决的

    2019-07-22 09:42

  • 1***@qq.com

    回复 4***@qq.com: 同问一下,您是怎么最后解决的,我也是请求图片,转成base64的,今天发现h5+app不能用responsetype

    2019-07-28 17:22

  • 4***@qq.com

    回复 1***@qq.com: 无解

    2019-10-29 19:15

DCloud_uni-ad_HDX

DCloud_uni-ad_HDX

Bug已修复,更新 HBuilderX

字符串示例

uni.request({  
  url: "https://www.dcloud.io",  
  responseType: "arrayBuffer",  
  success: (res) => {  
    var dv = new DataView(res.data);  
    var bufferLength = dv.byteLength;  
    var result = '';  
    for (var i = 0; i < bufferLength; i++) {  
      result += String.fromCharCode(dv.getInt8(i))  
    }  
    console.log(result);  
  }  
})

二进制文件示例

uni.request({  
  url: "https://dcloud.io/html5video/xiangeiailisi3.mid",  
  method: "GET",  
  responseType: "arraybuffer",  
  success: (res) => {  
    var dv = new DataView(res.data);  

    // M T h d  
    for (var i = 0; i <= 3; i++) {  
      console.log(String.fromCharCode(dv.getInt8(i)));  
    }  

    // 0 0 0 6 0 1 0 2  
    for (var i = 4; i <= 11; i++) {  
      console.log(dv.getInt8(i));  
    }  

    // M t r k  
    for (var i = 14; i <= 18; i++) {  
      console.log(String.fromCharCode(dv.getInt8(i)));  
    }  
  }  
});
  • 1***@qq.com

    官网上显示 responseType合法值:text、arraybuffer -- App和支付宝小程序不支持 ;

    但按照您实例,响应的res里,data为 { };

    求解!!! 我这请求的是bin文件(二进制),响应的数据要么JSON访问不到,要么直接显示为空,怎么正确读出来

    2020-09-29 14:14

Neil_HL

Neil_HL

String模式的,你 JSON.parse 一下应该就可以了

  • DylanJi (作者)

    关键问题是我传输的内容不是String模式的,是二进制流模式的,如果转换成String的话,就全部乱了。我是要拿到本地后,用bytearray来解析的

    2019-03-01 16:40

一秒一喵

一秒一喵

我也遇到这个问题了,烦恼中

y***@yeah.net

y***@yeah.net

为什么还不修复呢@DCloud_UNI_HDX

y***@yeah.net

y***@yeah.net

2.2.1.20190813

  • 修复 部分情况下 node插件安装状态错误的Bug
  • 修复 部分情况下 HBuilderX启动后只出现图标,窗口无法显示的Bug
  • 新增 manifest可视化界面 添加Android选择CPU的设置
  • 【uni-app插件】
    • App平台 修复 uni.request 接口中 responseType 参数设置为 arraybuffer 时,请求无效的 Bug 详情

我试了一下bug依旧在,没有被修复。android下返回的依旧是字符串

@DCloud_UNI_HDX

DCloud_uni-ad_HDX

DCloud_uni-ad_HDX

HBuilderX 2.2.1 已修复,测试代码

uni.request({  
    url: "https://dcloud.io/html5video/xiangeiailisi3.mid",  
    method: "GET",  
    responseType: "arraybuffer",  
    success: (res) => {  
        var dv = new DataView(res.data);  

        // M T h d  
        for (var i = 0; i <= 3; i++) {  
            console.log(String.fromCharCode(dv.getInt8(i)));  
        }  

        // 0 0 0 6 0 1 0 2  
        for (var i = 4; i <= 11; i++) {  
            console.log(dv.getInt8(i));  
        }  

        // M t r k  
        for (var i = 14; i <= 18; i++) {  
            console.log(String.fromCharCode(dv.getInt8(i)));  
        }  
    }  
});
  • y***@yeah.net

    uni.request({  
    url: "https://dcloud.io",
    method: "GET",
    responseType: "arraybuffer",
    success: res => {
    console.log(res.data)

    }


    这段代码在H5下输出ArrayBuffer类型,在Android输出的是字符串(网页的html)

    2019-08-16 11:57

  • 孙逊大神

    回复 y***@yeah.net: 我在API看5+App和支付宝小程序不支持,是不是现在彻底不支持APP了,

    2019-10-29 11:33

deng先生

deng先生

已经更新 HBuilderX,安卓模拟器上调用uni.request 中responseType设置为arraybuffer,返回的data还是字符串

parons

parons

请求那边不变,回来用uni.arrayBufferToBase64

const arrayBuffer = new Uint8Array(res.data)  
const base64 = "data:image/png;base64,"+uni.arrayBufferToBase64(arrayBuffer)  
this.verifyCodeImg=base64

要回复问题请先登录注册