前端大文件上传-断点续传
大文件上传与断点续传
在现代的前端开发中,大文件上传是一个常见的需求,比如上传视频、图片、压缩包等。然而,随着文件体积越来越大,上传过程中可能会遇到网络中断、上传失败等问题。为了提高用户体验,我们可以实现断点续传功能,让用户在上传中断后无需重新上传整个文件,而是从中断的地方继续上传。
一、大文件上传的挑战
- 文件体积大:上传大文件时,网络波动可能导致上传失败。
- 上传时间长:用户等待时间过长,体验不佳。
- 中断问题:网络断开或页面刷新后,上传进度丢失,用户需要重新上传整个文件。
为了解决这些问题,我们可以将文件切分成小块(分片),逐块上传,并记录上传进度。这样即使上传中断,也可以从中断的地方继续上传。
二、断点续传的核心思路
断点续传的实现主要依赖以下几个步骤:
- 文件分片:将大文件切分成多个小块(比如每块2MB)。
- 逐块上传:每次上传一个分片,上传成功后再上传下一个分片。
- 记录进度:记录哪些分片已经上传成功,哪些分片还未上传。
- 断点续传:如果上传中断,重新上传时只需上传未完成的分片。
三、前端实现
1. 文件分片
在前端,我们可以使用 File
对象的 slice
方法将文件切分成多个小块。例如:
function sliceFile(file, chunkSize) {const chunks = [];let start = 0;while (start < file.size) {const end = Math.min(start + chunkSize, file.size);const chunk = file.slice(start, end);chunks.push(chunk);start = end;}return chunks;
}
file
是用户上传的文件。chunkSize
是每个分片的大小(比如 2MB = 2 * 1024 * 1024 字节)。slice
方法可以从文件中提取指定范围的内容。
2. 上传分片
我们可以使用 fetch
或 axios
将分片逐块上传到服务器。每次上传时,附带分片的序号和文件的唯一标识(比如文件名或哈希值),以便服务器记录上传进度。
async function uploadChunk(