es6 class 封装文件上传组件的核心是将选文件、校验、上传、反馈、重试、清理整条链路收束到类中,通过配置驱动、状态管理、内置校验、事件透出和可扩展策略实现高内聚低耦合。

用 ES6 Class 封装文件上传组件,关键不是把 XMLHttpRequest 或 fetch 包一层,而是把“选文件、校验、传、反馈、重试、清理”这一整条链路收束到类中,让调用方只关心业务逻辑,不操心底层细节。
支持配置驱动与状态管理
构造函数接收完整配置,而不是零散参数。比如 URL、是否自动上传、文件限制、接受类型、额外参数等,都应在初始化时明确声明:
- 配置项如
multiple(多选)、accept(类型白名单)、maxSize(单位字节)直接参与校验逻辑 - 内部维护一个
files数组,记录当前待上传或已上传的文件元信息(name、size、status、progress) - 提供
add(file)、remove(index)、clear()等方法控制文件列表,而非暴露原始数组
内置校验与错误拦截
上传前必须做防御性检查,不能依赖后端兜底:
- 文件个数超限?立即拒绝并触发
error事件,返回具体原因(如"最多上传5个文件") - 类型不匹配?比对
file.type和accept规则(支持.pdf、image/*、video/mp4等写法) - 大小超标?用
file.size > this.config.maxSize判断,错误信息带原始大小和允许上限 - 所有校验失败都应同步抛出可捕获的错误对象,方便上层统一处理
进度与生命周期事件透出
用事件机制解耦 UI 更新与上传逻辑,避免回调地狱:
- 定义标准事件名:
choose(选中文件)、progress(含 loaded/total/rate/timestamp)、success(含服务端响应)、error(含网络或业务错误) - 支持链式注册:
uploader.on('success', res => {...}).on('progress', e => {...}) - 每个事件回调接收语义化参数,例如
progress事件传入{ file, loaded, total, rate, speed },其中speed是实时计算的 KB/s
可扩展的上传策略接口
预留钩子应对不同场景,不把实现写死:
-
beforeUpload(file)方法可被子类重写,用于添加签名、压缩图片、分片预处理等 -
requestAdapter配置项允许替换默认请求方式(如改用fetch或封装好的 axios 实例) - 失败时提供
retry(file, times = 3)方法,内部自动指数退避重试 - 支持暂停/恢复(基于
xhr.abort()和断点续传标记),适用于大文件场景











