分片上传
分片上传是一种将大文件分割成多个较小数据块,然后逐个上传到服务器的上传方式。相比一次性上传整个大文件,分片上传可以提高上传效率和稳定性。
通过分片上传,可以将大文件切分成多个较小的数据块,每个数据块的大小通常在几十KB到几MB之间。然后,使用网络请求工具(如XMLHttpRequest)将这些数据块逐个上传到服务器。
分片上传的好处是可以在上传过程中实时显示上传进度,并且在某个数据块上传失败时,只需要重新上传该数据块,而不需要重新上传整个大文件。
在服务器端,需要接收并保存这些数据块,并在所有数据块都上传完成后,将它们合并成完整的文件。
分片上传常用于大文件上传、断点续传等场景,可以提高上传的效率和用户体验。
是一种将大文件拆分为较小的片段并逐个上传的方式。这种方式可以降低单个文件上传的时间和网络传输的风险。
下面是一个简单的分片上传的示例代码:
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
| // 客户端 <input type="file" id="fileInput">
// JavaScript <script> var fileInput = document.getElementById('fileInput'); var file = fileInput.files[0]; var chunkSize = 2097152; // 每个数据块的大小为2097152字节
var currentChunk = 0; var totalChunks = Math.ceil(file.size / chunkSize);
var reader = new FileReader();
reader.onload = function(e) { var xhr = new XMLHttpRequest(); xhr.open('POST', '/upload', true); xhr.setRequestHeader('Content-Type', 'application/octet-stream'); xhr.setRequestHeader('X-Chunk-Number', currentChunk); xhr.setRequestHeader('X-Total-Chunks', totalChunks);
xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { currentChunk++; if (currentChunk < totalChunks) { readNextChunk(); } else { console.log('文件上传完成'); } } };
xhr.send(e.target.result); };
function readNextChunk() { var start = currentChunk * chunkSize; var end = Math.min(start + chunkSize, file.size); var chunk = file.slice(start, end);
reader.readAsArrayBuffer(chunk); }
readNextChunk(); </script>
// 服务器端 <?php $chunkNumber = $_SERVER['HTTP_X_CHUNK_NUMBER']; $totalChunks = $_SERVER['HTTP_X_TOTAL_CHUNKS'];
$targetDirectory = 'uploads/'; $targetFile = $targetDirectory . basename($_FILES['file']['name']);
move_uploaded_file($_FILES['file']['tmp_name'], $targetFile . '.' . $chunkNumber);
if ($chunkNumber == $totalChunks - 1) { // 所有分片上传完成,可以进行文件合并操作 // ... } ?>
|
上述示例代码中,前端使用JavaScript将文件分割为较小的数据块,并通过XMLHttpRequest逐个上传到服务器。服务器端接收到每个数据块后,将其保存到指定的目录中。当所有数据块都上传完成后,可以进行文件合并操作。