主题
大文件分片上传实战
在前端项目中上传大文件(如视频或压缩包)时,直接上传容易失败或者网络中断。通过分片上传可以提高成功率并支持断点续传。
1. 将文件切片
javascript
const file = document.getElementById("fileInput").files[0];
const chunkSize = 2 * 1024 * 1024; // 2MB 每片
const chunks = Math.ceil(file.size / chunkSize);2. 使用 Axios 上传每一片
javascript
import axios from "axios";
async function uploadFile(file) {
const chunkSize = 2 * 1024 * 1024; // 2MB
const chunks = Math.ceil(file.size / chunkSize);
for (let i = 0; i < chunks; i++) {
const start = i * chunkSize;
const end = Math.min(file.size, start + chunkSize);
const formData = new FormData();
formData.append("file", file.slice(start, end));
formData.append("chunkIndex", i);
formData.append("totalChunks", chunks);
await axios.post("/upload/chunk", formData, {
onUploadProgress: (e) => {
const percent = Math.round(((i + e.loaded / e.total) / chunks) * 100);
console.log(`上传进度:${percent}%`);
},
});
}
}3. 服务端合并文件
- 服务端根据每片索引和总片数,按顺序合并文件。
- 前端只需上传完所有分片后触发合并接口:
javascript
await axios.post("/upload/merge", { fileName: file.name });4. 优势
- 提高稳定性:网络中断只需重传失败的分片;
- 支持大文件:突破浏览器或服务器单次上传限制;
- 进度管理清晰:可显示整个文件上传进度。
💡 小提示:结合
async/await可以保证顺序上传,也可使用并发上传策略提高速度;分片上传适合大文件、视频、图片压缩包等场景。