大文件分片上传实战
在前端项目中上传大文件(如视频或压缩包)时,直接上传容易失败或者网络中断。通过分片上传可以提高成功率并支持断点续传。
1. 将文件切片
const file = document.getElementById("fileInput").files[0];
const chunkSize = 2 * 1024 * 1024; // 2MB 每片
const chunks = Math.ceil(file.size / chunkSize);
2. 使用 Axios 上传每一片
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. 服务端合并文件
- 服务端根据每片索引和总片数,按顺序合并文件。
- 前端只需上传完所有分片后触发合并接口:
await axios.post("/upload/merge", { fileName: file.name });
4. 优势
- 提高稳定性:网络中断只需重传失败的分片;
- 支持大文件:突破浏览器或服务器单次上传限制;
- 进度管理清晰:可显示整个文件上传进度。
💡 小提示:结合
async/await可以保证顺序上传,也可使用并发上传策略提高速度;分片上传适合大文件、视频、图片压缩包等场景。
相关内容
- 缓存与重复请求优化 本章节介绍如何在前端项目中使用 Axios 优化请求缓存与防止重复请求,包括浏览器缓存、内存缓存、请求去重策略、拦截器结合缓存、缓存过期处理等方法,帮助提高接口...
- 前端容错与兜底策略 本章节讲解如何在前端使用 Axios 实现容错与兜底策略,包括请求失败处理、默认数据返回、全局错误提示、降级方案、备用接口调用等方法,确保应用在网络异常或接口异...
- 接口统一管理与类型定义 本章节介绍如何在前端项目中使用 Axios 统一管理接口请求,包括接口模块化、统一封装、请求类型定义、TypeScript 类型约束、接口文档维护及调用规范化。...
- 取消请求(CancelToken 与 AbortController) 本章节讲解如何在 Axios 中取消请求,包括使用 CancelToken 和 AbortController 两种方式,适用于用户快速切换页面或重复请求时,防...
- 同时发送多个请求(axios.all / axios.spread) 本章节讲解如何使用 Axios 同时发送多个请求,包括 axios.all 和 axios.spread 的使用方法,帮助前端项目高效处理并发请求,提高数据获取...
- 防止重复请求的策略 本章节讲解如何在 Axios 中防止重复请求,包括使用请求标识、拦截器和节流/防抖机制,避免用户多次触发同一接口导致的冗余请求,提高前端性能和接口稳定性。