大文件分片上传,主要是为了提高上传效率,避免网络问题或者其他原因导致整个上传失败。
HTML部分没什么特殊代码,这里只写js代码。用原生js实现,框架中可参考实现
常规版本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| const ipt = document.querySelector("input")
ipt.onchange = async (e) => { const file = e.target.files[0]; if (!file) { return } cutFile(file).then(res => {
}) }
const CHUNK_SIZE = 1 * 1024 * 1024; async function cutFile(file) { let res = []; let chunkCount = Math.ceil(file.size / CHUNK_SIZE); for (let i = 0; i < chunkCount; i++) { let chunk = await createChunks(file, i, CHUNK_SIZE) res.push(chunk); } return res; }
function createChunks (file, index, chunkSize) { return new Promise((resolve) => { const start = index * chunkSize; const end = start + chunkSize; const spark = new SparkMD5(); const fileReader = new FileReader(); const blob = file.slice(start, end); fileReader.onload = e => { spark.append(e.target.result) resolve({ start, end, blob, hash: spark.end(), index }); } fileReader.readAsArrayBuffer(blob)
}); }
|
大致思路如上,可能有些细节在使用时需要自己调整