前端项目中直接调取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)
})
}
})
}