JavaScript 文件上传核心是 File API 与 FormData 配合 fetch/XHR:通过 input[type=file] 获取 FileList,用 FileReader 异步读取内容,再以 FormData 提交至后端,并校验类型、大小及错误处理。
文件上传在 JavaScript 中主要靠 File API 和 FormData 配合 fetch 或 XMLHttpRequest 实现,核心是让用户选中文件、读取元数据或内容、再发给后端。
通过 获取文件列表,files 属性返回 FileList 对象(类似数组):
input.files[0];多文件需遍历 input.files
File 是 Blob 的子类,自带 name、size、type、lastModified 等属性change 事件,避免重复提交或未触发用 FileReader 异步读取文件内容,适合预览、校验或转 Base64:
readAsDataURL(file) → 得到 data URL,可直接赋给
readAsText(file, encoding) → 读文本文件(如 JSON、CSV)readAsArrayBuffer(file) → 适合二进制处理或大文件分片FileReader 是异步的,用 onload 拿结果,onerror 处理失败推荐用 FormData 包装文件,自动设置 Content-Type: multipart/form-data:
const fd = new FormData(); fd.append('file', file);fd.append('desc', '封面图')
fetch('/upload', { method: 'POST', body: fd }) 发送,无需手动设 headerXMLHttpRequest 的 upload.onprogress 更直观;fetch 需配合 ReadableStream(较复杂)把上面几步串起来,一个最小可用上传逻辑:
input.files.length,防止没选文件if (!file.type.startsWith('image/')) 提示仅支持图片if (file.size > 5 * 1024 * 1024)(5MB)
ut:input.value = '',避免重复选同一文件不触发 change基本上就这些。File API 不复杂但容易忽略细节,比如文件为空、类型不符、网络中断时的反馈,加上基础校验和提示,体验会好很多。