如果文件体积比较大,或者网络条件不好时,上传的时间会比较长(要传输更多的报文,丢包重传的概率也更大),用户不能刷新页面,只能耐心等待请求完成。
File
对象,由于File
对象是特殊类型的Blob
, File
接口也继承了Blob
接口的属性,分片上传的核心思想就是利用File
继承Blob
接口的Blob.slice
方法Blob.slice
方法可以将我们的文件切分为多个单个的切片,分片上传的思想就是利用slice APi
将文件分割成多个切片,然后利用浏览器多进程的特性进行并发上传function slice(file, piece = 1024 * 1024 * 5) {
let totalSize = file.size; // 文件总大小
let start = 0; // 每次上传的开始字节
let end = start + piece; // 每次上传的结尾字节
let chunks = []
while (start < totalSize) {
// 根据长度截取每次需要上传的数据
// File对象继承自Blob对象,因此包含slice方法
let blob = file.slice(start, end);
chunks.push(blob)
start = end;
end = start + piece;
}
return chunks
}
chunks.forEach(chunk=>{
let fd = new FormData();
fd.append("file", chunk);
post(‘/bigFile‘, fd)
})
标识符一般通过以下两种方式获取
即使将大文件拆分成切片上传,我们仍需等待所有切片上传完毕,在等待过程中,可能发生一系列导致部分切片上传失败的情形,如网络故障、页面关闭等。由于切片未全部上传,因此无法通知服务端合成文件。这种情况下可以通过断点续传来进行处理。
主要思路
对于切片信息的保存一般采用以下两种方式
在上传切片前将文件的基本信息发送至服务端进行验证,判断该文件是否需要重新上传,如果已经上传就返回上传结果,实现秒传
验证方法
原文:https://www.cnblogs.com/dark-duck/p/14326058.html