IPhone上使用git同步博客
- 07 Aug, 2024

大文件分片上传是一种将大文件分成多个小块并逐个上传的方法。这种方法可以提高上传效率,并在网络中断时实现续传。以下是一个大文件分片上传的基本实现步骤:
-
前端实现:
- 文件选择:用户选择要上传的文件。
- 分片处理:将大文件分成若干小块。
- 发送分片:逐个上传分片到服务器。
- 续传处理:记录已上传的分片,在网络中断时继续上传未完成的部分。
-
后端实现:
- 接收分片:接收并存储文件分片。
- 合并分片:在所有分片上传完成后,将分片合并成完整文件。
- 续传处理:支持前端请求的断点续传。
下面是一个简单的示例,演示如何使用前端和后端实现大文件分片上传。
前端代码(使用JavaScript)
// HTML 文件选择器
<input type="file" id="fileInput" />
<script>
const fileInput = document.getElementById('fileInput');
const chunkSize = 5 * 1024 * 1024; // 分片大小,5MB
fileInput.addEventListener('change', async (event) => {
const file = event.target.files[0];
const 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);
const formData = new FormData();
formData.append('chunk', chunk);
formData.append('index', i);
formData.append('totalChunks', totalChunks);
formData.append('fileName', file.name);
try {
await fetch('http://localhost:3000/upload', {
method: 'POST',
body: formData,
});
console.log(`Chunk ${i + 1}/${totalChunks} uploaded successfully`);
} catch (error) {
console.error(`Chunk ${i + 1}/${totalChunks} upload failed`, error);
}
}
console.log('All chunks uploaded');
});
</script>
后端代码(使用Node.js和Express)
const express = require('express');
const multer = require('multer');
const fs = require('fs');
const path = require('path');
const app = express();
const upload = multer({ dest: 'uploads/' });
app.post('/upload', upload.single('chunk'), (req, res) => {
const { index, totalChunks, fileName } = req.body;
const chunk = req.file;
const filePath = path.join(__dirname, 'uploads', fileName);
// 追加模式写入文件
fs.appendFileSync(filePath, fs.readFileSync(chunk.path));
fs.unlinkSync(chunk.path);
if (parseInt(index) + 1 === parseInt(totalChunks)) {
console.log(`File ${fileName} uploaded successfully`);
}
res.sendStatus(200);
});
app.listen(3000, () => {
console.log('Server started on port 3000');
});
进一步优化
-
断点续传:
- 前端在每次上传分片时记录当前进度,网络中断时可以继续上传未完成的部分。
- 后端保存已上传的分片信息,客户端请求时返回已上传的分片列表,前端根据此信息进行续传。
-
合并分片:
- 后端在接收所有分片后,将分片合并成一个完整文件。
- 可以在每次接收到分片时检查是否所有分片都已上传完毕,如果是,则进行合并操作。
-
安全和校验:
- 使用 MD5 或 SHA256 对分片进行校验,确保文件完整性。
- 实现用户认证和权限控制,确保只有授权用户可以上传文件。
这样可以实现一个可靠的大文件分片上传系统。