核心代码如下:
let step = 2048 // 切分为2048字节分段上传
let file = input.files[0] // 从表单中获取文件
let reader = new FileReader() // 构建文件读取对象
reader.readAsArrayBuffer(file) // 以流的方式读取文件到对象的result属性中
reader.onload = function(){ // 由于是异步加载,绑定读取成功事件,在事件中分段读取上传
let start = 0 // 定义起始位置
let len = this.result.byteLength // 获取文件总长度
while(start < len){ // 循环切片
let end = start + step; // 定义本次切片结束为止
end = end > len ? len : end // 判断结束为止是否超过总文件长度,如果超过则结束为止为文件总长度
let buf = blobSlice(this.result, start, end) // 切片函数对流切片
// upload(buf) // 上传方法
start = end; // 将开始位置同步到结束位置
}
}
// 切片函数,主要做兼容性处理
function blobSlice(blob, start, length) {
if (blob.slice) {
return blob.slice(start, length)
} else if (blob.webkitSlice) {
return blob.webkitSlice(start, length)
} else if (blob.mozSlice) {
return blob.mozSlice(start, length)
} else {
return null
}
}