type=file 读取、压缩、上传
前端 file 上传全流程实战:读取、压缩、阿里云OSS上传
最近做文件/图片上传功能,踩了不少坑——从文件读取、类型大小校验,到图片压缩适配iOS/安卓,再到对接阿里云OSS上传,整理出了一套完整的实战方案。今天结合项目里的代码,把 type="file" 处理的核心逻辑拆解开,新手也能直接复用。
一、核心需求与整体流程
我们要实现的功能:
- 选择文件后,先做基础校验(类型、大小);
- 图片文件自动压缩(超过阈值才压缩,iOS特殊处理);
- 对接阿里云OSS 上传(先获取上传Policy,再构造FormData上传);
- 兼容不同浏览器(比如低版本Blob兼容、Base64转File)。
整体流程:
1 | |
二、核心功能拆解(附完整可运行代码)
先修正原代码中的语法错误(比如少运算符、引号不匹配、变量名笔误),再按功能模块拆解:
1. 全局变量与基础配置
1 | |
2. 第一步:文件读取与基础校验
选择文件后,先校验类型、大小,区分iOS/安卓做不同处理(iOS无需压缩,直接上传):
1 | |
3. 第二步:图片压缩(Canvas核心实现)
超过200KB的图片,用Canvas压缩(降低质量,不改变尺寸),兼容低版本浏览器Blob构造:
1 | |
4. 第三步:阿里云OSS上传(核心)
先获取OSS上传Policy(包含AccessKey、签名等),再构造FormData上传,上传成功后更新预览:
1 | |
5. HTML调用示例
1 | |
三、关键避坑点(实战总结)
- iOS兼容:iOS系统下图片压缩容易出问题,直接跳过压缩步骤更稳定;
- Blob构造兼容:低版本浏览器(如IE、旧版Chrome)不支持
new Blob(),需用BlobBuilder兜底; - DataURL转File:压缩后的DataURL需先转Blob,再转File(保持文件名和类型);
- axios上传进度:无需自己写XHR,axios的
onUploadProgress可直接监听进度; - OSS上传注意:
- 必须先获取Policy(包含签名),否则上传会被拒绝;
Content-Type无需手动拼接,axios会自动加boundary;- 文件名需encodeURIComponent,避免中文/特殊字符报错。
四、拓展:非图片文件上传(简化版)
如果是文档(Word/Excel/PDF)等非图片文件,无需压缩,直接读取+校验+上传即可:
1 | |
五、完整代码总结
核心逻辑梳理:
- 文件读取:
FileReader转DataURL(图片压缩用); - 压缩核心:Canvas绘制+
toDataURL调整质量; - OSS上传:先获取Policy→构造FormData→POST上传;
- 兼容处理:iOS跳过压缩、低版本Blob构造、文件名编码。
这套方案覆盖了前端file上传的核心场景,图片压缩适配移动端,OSS上传对接企业级存储,直接复制即可复用(只需调整OSS Policy接口和配置项)。
type=file 读取、压缩、上传
https://cszy.top/2017-12-12 图片-读取、压缩、上传/