JavaScript文件上传核心用FormData+XMLHttpRequest或fetch;进度显示依赖xhr.upload.onprogress;大文件需分片上传+断点续传;辅以类型大小校验、按钮禁用、失败重试及本地预览等体验优化。
JavaScript 实现文件上传,核心是利用 XMLHttpRequest 或更现代的 fetch 配合 FormData;处理大文件和进度显示,则依赖 XMLHttpRequest.upload.onprogress(fetch 目前不支持原生上传进度),并常需分片上传来提升稳定性与可控性。
这是最通用、兼容性好的方式,适合中小文件(如几 MB 以内):
FormData 实例,把 的 files[0] 追加进去XMLHttpRequest,设置请求方法(POST)、URL,并监听 load 和 error
xhr.send(form) 即可发送服务端收到的是标准 multipart 表单数据,无需额外解析库(如 Express 中可用 multer)。
fetch 暂不提供上传过程的进度事件,所以要实时显示进度条,得用 XMLHttpRequest 并监听其 upload.onprogress:
xhr.upload.onprogress = e => { ... } 中获取 e.loaded(已传字节数)和 e.total(总字节数)Math.round((e.loaded / e.total) * 100),更新 UI 元素(如 或自定
义 div)e.total 可能为 0(如某些浏览器对 Blob 上传未设 total),建议加空值判断直接传大文件容易失败、无法暂停、占用内存高。推荐分片上传(chunked upload):
File.prototype.slice() 将文件切分为固定大小块(如 5MB/片)可配合 Web Worker 处理切片和 hash 计算,避免阻塞主线程;使用 AbortController 支持手动取消。
让上传更健壮、用户更安心:
file.size > MAX_SIZE),提前提示而非等后端返回 413URL.createObjectURL(file) 快速预览图片/视频,无需上传即可确认内容不复杂但容易忽略。