前端分片上传
前端分片上传是一种将大文件分成若干个小块进行上传的方式,以解决大文件上传时网络不稳定或上传速度慢的问题。下面是前端分片上传的基本步骤:
- 使用JavaScript读取文件,将文件分成若干块。可以使用File API来实现这个功能。
- 使用XMLHttpRequest对象或Fetch API向服务器发送每一块。在发送每一块时,需要设置HTTP请求的Range头标来标识当前上传的位置。
- 服务器接收到块之后,将块保存到硬盘或内存中。在保存块时,需要注意块的顺序必须与文件的顺序相同。
- 当所有块都上传完毕之后,服务器将所有块组合成一个完整的文件。可以使用Node.js的fs模块来实现这个功能。
示例:
<!DOCTYPE html>
<html>
<head>
<title>File Upload</title>
</head>
<body>
<input type="file" id="file-upload" />
<button id="upload-btn">Upload</button>
<script>
const fileInput = document.getElementById('file-upload');
const uploadButton = document.getElementById('upload-btn');
let file;
let totalChunks = 0;
let currentChunk = 0;
let chunks = [];
function uploadFile() {
file = fileInput.files[0];
const chunkSize = 1024 * 1024; // 1MB
totalChunks = Math.ceil(file.size / chunkSize);
for (let i = 0; i < totalChunks; i++) {
const start = i * chunkSize;
const end = Math.min(file.size, start + chunkSize);
const chunk = file.slice(start, end);
chunks.push(chunk);
}
uploadChunks();
}
function uploadChunks() {
if (currentChunk < totalChunks) {
const xhr = new XMLHttpRequest();
const formData = new FormData();
formData.append('chunk', chunks[currentChunk]);
xhr.open('POST', '/upload', true);
xhr.onload = function() {
if (xhr.status === 200) {
currentChunk++;
uploadChunks();
} else {
alert('Upload failed!');
}
};
xhr.send(formData);
} else {
alert('Upload successful!');
}
}
uploadButton.addEventListener('click', uploadFile);
</script>
</body>
</html>