技术栈:Vue3 + SpringBoot + Django + vLLM + Milvus + MinIO | 移动端上传策略 & 技术选型
核心结论:不是H5本身慢,大多是上传策略设计问题。
野外场景:广州野外机器人4G上行带宽仅 1~2Mbps,10MB原图理论就要40~80秒。这是带宽物理瓶颈,Flutter也无法突破。
| 优化点 | 实现做法 | 效果 |
|---|---|---|
| 图片压缩 | Canvas压缩到1920px宽,输出WebP,质量0.8 | 10MB原图 → 1~2MB,速度提升约5倍 |
| 分片上传 | 分片大小2~5MB,并发3片同时上传 | 断网仅重传失败分片,无需全部重传 |
| 断点续传 | IndexedDB记录已上传分片索引,网络恢复继续上传 | 中断后恢复,不从头开始上传 |
| 后台上传队列 | IndexedDB维护上传任务队列,切页面不中断任务 | 用户可继续操作页面,上传后台异步执行 |
| 缩略图优先策略 | 先上传200px缩略图给AI快速预览识别,原图后台异步补传 | 巡检人员秒级看到AI识别结果,不需要等待原图上传完成 |
| 弱网自动降级 | 2G/3G环境自动降低分辨率,仅上传关键帧 | 弱网环境页面不卡死,保障基础业务可用 |
这套优化全部基于H5原生能力实现,完成后野外巡检拍照上传体验完全满足当前业务需求。PRD补充:缩略图优先 + 前端压缩 + 并发分片。
| 对比项 | Vue3 H5(主方案) | Flutter(备选方案) |
|---|---|---|
| 开发成本 | ✅ 低,复用现有前端团队,一套代码PC+H5,无需额外学习新语言 | ❌ 高,需要学习Dart;独立Flutter工程,与Vue代码无法复用 |
| 拍照 & 大文件上传 | ✅ 优化后可用:Canvas压缩、并发分片、断点续传、IndexedDB任务队列; 限制:浏览器后台/锁屏时JS线程可能被系统挂起 |
✅ 原生能力强:后台保活上传;原生相机相册API,EXIF处理更稳定;大视频流式上传内存占用更低 |
| 离线能力 | IndexedDB做离线缓存;页面切后台复杂本地任务容易被系统回收 | 原生SQLite,离线存储可靠性更高,后台任务保活 |
| 打包交付 | 无需打包App,浏览器直接访问,迭代发布无需应用商店审核 | 可打包Android/IOS安装包;版本更新需要App发布流程 |
| 硬件交互 | 蓝牙、串口、外设支持有限 | 原生支持蓝牙、串口、硬件外设对接 |
| 适用场景建议 | 优先采用:巡检频次不高,拍照间隔几分钟一次;快速迭代,不想维护多端App。 通过前端压缩+分片+缩略图优先策略解决野外弱网上传问题。 |
作为备选:仅当业务达到「连续拍摄50张照片+多段视频,锁屏后台持续上传半小时」场景,或者需要对接蓝牙/串口硬件时,才考虑切换Flutter。 |
切换触发条件:野外巡检连续拍摄50张照片+多段视频,需要锁屏后台持续上传半小时;原型/面试阶段业务量未达到,无需上Flutter。