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 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78
| function uploadFile(file) { const chunkSize = 1024 * 1024 * 2; const fileSize = file.size; const chunkNum = Math.ceil(fileSize / chunkSize); let uploadedSize = 0; let chunks = []; function uploadChunks() { if (chunks.length === chunkNum) { mergeChunks(); return; } const start = chunks.length * chunkSize; const end = Math.min(start + chunkSize, fileSize); const chunk = file.slice(start, end); const fd = new FormData(); fd.append('chunk', chunk); fd.append('chunkNum', chunks.length + 1); fd.append('fileName', file.name); fd.append('fileSize', fileSize); const xhr = new XMLHttpRequest(); xhr.open('POST', 'upload.php', true); xhr.onload = function() { if (xhr.status === 200) { const res = JSON.parse(xhr.responseText); if (res.code === 0) { uploadedSize += chunk.size; chunks.push(res.data); const progress = uploadedSize / fileSize; updateProgress(progress); uploadChunks(); } } }; xhr.send(fd); } function mergeChunks() { const xhr = new XMLHttpRequest(); xhr.open('POST', 'merge.php', true); xhr.onload = function() { if (xhr.status === 200) { const res = JSON.parse(xhr.responseText); if (res.code === 0) { const url = res.data; uploadSuccess(url); } else { uploadFail() } } }; xhr.setRequestHeader('Content-Type', 'application/json'); xhr.send(JSON.stringify({ fileName: file.name, fileSize: fileSize, chunks: chunks })); } function updateProgress(progress) { } function uploadSuccess(url) { } function uploadFail(err) { } uploadChunks(); }
|
==uploadFile== 函数会先根据文件大小和分片大小计算出分片数量,然后依次上传每个分片,并记录已上传分片的信息。当所有分片上传完成后,会调用 ==mergeChunks== 函数将分片合并,并传递文件名、文件大小和分片信息给后端进行合并操作。最后,如果合并成功,就会调用==uploadSuccess==函数进行上传成功后的处理。
up6组件
https://gitee.com/xproer/up6-vue-cli
