解决js 调取Minio下载接口返回值的问题

        前端项目中直接调取minio的getObject接口会遇到返回多个字节流的问题

        之前实现下载功能都是调取后端提供的接口,直接获取到某个文件的所有字节流,然后转blob,实现下载功能。

        这是第一次直接调取minio的下载接口,直接获取minio上存储文件的字节流,txt文件可以一次全部返回,但是pdf,word等类型文件,会返回多个文件流,导致点击一次下载按钮,却频频出现下载框,并且出现拿到的文件内容不全的情况。解决方案如下:

        

// 下载minio中的文件

function getMinioFile(bucketName, fileName, callback, sourceName) {

    var size = 0 //定义一个记录完整字节流长度的变量

    window.minioClient.getObject(bucketName, fileName, (err, data) => {

        if (err) {

            return Message('下载失败')

        } else {

            let arr = new Array()//定义一个数组,接收接口返回的所有字节流

            data.on('data', function (chunk) {

                if (chunk.length > 0) {//如果返回的字节流为空,则不往arr里添加

                    arr.push(chunk)//接收字节流

                    size += chunk.length//记录字节流长度

                }

            })

            data.on('end', function () {//end时,说明所有字节流返回完毕

                const u8arr = new Uint8Array(size);//定义一个存放字节流的数组,把数组需要的大小作为参数传进去

                let u8arrindex = 0;//定义一个记录字节流数组位置的下标

                // 此时的arr是二元数组,所以需要双层循环,把所有字节流拿出来,拼装到u8arr中

                for (let i = 0; i < arr.length; i++) {

                    for (let j = 0; j < arr[i].length; j++) {

                        u8arr[u8arrindex] = arr[i][j];

                        u8arrindex += 1;

                    }

                }

                // u8arr中已存放了所有字节流,再进行转blob等操作

                callback(u8arr, sourceName)

            })

        }

    })

}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值