我目前的方案是:
const _getFile = (path) => {
return new Promise((resolve, reject) => {
plus.io.resolveLocalFileSystemURL(path, entry => {
if (entry.isFile) {
entry.file(file => {
resolve(file)
}, err => {
reject(err)
})
} else {
reject("not a file")
}
}, err => {
reject(err)
})
})
}
const _readBuffer = (file) => {
return new Promise((resolve, reject) => {
const reader = new plus.io.FileReader()
console.log('start to read', Date.now())
reader.onload = (e) => {
console.log('read finished', Date.now())
let s = e.target.result
s = s.replace(/^data:[^;]+;base64,/, '')
s = uni.base64ToArrayBuffer(s)
console.log('decode finished', Date.now())
resolve(s)
//resolve(e.target.result)
}
reader.onerror = (err) => {
reject(err)
}
reader.readAsDataURL(file)
//reader.readAsArrayBuffer(file) //没有这个方法??
})
}
就是先读取为base64,然后转换为ArrayBuffer,经过测试读取1M数据时间为约500ms,转换时间约70ms。
为什么不直接提供reader.readAsArrayBuffer(file),读取的直接结果不应该就是ArrayBuffer吗?去掉编码解码时间,可以提速30%左右。这个需求貌似几年前就有人提过,是有什么其他限制?
2 个回复
1***@qq.com
同,真的很需要这个功能!,从base64再转二进制和直接获取为二进制也有区别吧
翼账科技
同问,这个场景很常见,现在很多上传请求后端都需要put请求了,而uni.uploadFile又只能方式post请求;