分片上传

分片上传是一种将大文件分割成多个较小数据块,然后逐个上传到服务器的上传方式。相比一次性上传整个大文件,分片上传可以提高上传效率和稳定性。

通过分片上传,可以将大文件切分成多个较小的数据块,每个数据块的大小通常在几十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逐个上传到服务器。服务器端接收到每个数据块后,将其保存到指定的目录中。当所有数据块都上传完成后,可以进行文件合并操作。