前端文件上传进阶:告别原生 input 的局限
为什么需要优化上传体验
在实际项目中,直接依赖原生的 <input type="file"> 处理大文件往往会导致浏览器假死。想象一下,用户等待一个 100MB 的文件上传完成却没有任何进度反馈,这种体验无异于在用小水管灌满游泳池。
常见误区
很多开发者习惯这样写:
<input type="file" onchange="uploadFile(this.files[0])" />
<script>
function uploadFile(file) {
const formData = new FormData();
formData.append('file', file);
// 直接上传,没有进度,没有断点续传
fetch('/api/upload', { method: 'POST', body: formData });
}
</script>
这种方式虽然简单,但缺乏对网络波动的容错能力,且无法感知上传状态。
核心解决方案
1. 分片上传
将大文件切割成小块并行上传,既能提升速度,又能避免内存溢出。
class ChunkUploader {
constructor(file, options = {}) {
this.file = file;
this.chunkSize = options.chunkSize || 1024 * 1024; // 默认 1MB
this.chunks = Math.ceil(file.size / .);
. = ;
}
() {
promises = [];
( i = ; i < .; i++) {
start = i * .;
end = .(start + ., ..);
chunk = ..(start, end);
promises.(.(chunk, i));
}
.(promises);
.();
}
() {
formData = ();
formData.(, chunk);
formData.(, index);
formData.(, .);
formData.(, ..);
(, {
: ,
: formData
});
.++;
.(. / .);
}
() {
.();
}
() {
(, {
: ,
: { : },
: .({ : .., : . })
});
}
}


