系统里一有文件上传需求,"传大文件"的坑迟早要踩:工厂要传质检视频,设计部要传几百 M 的图纸包,现场要传设备录像。普通表单上传在这种量级面前全面失灵:传到一半网络抖一下前功尽弃,超时设置调再大也挡不住弱网环境。
核心矛盾是:HTTP 单次请求模型是为"小而快"设计的,大文件传输需要把"一次成功"的不确定性,拆解成"多次小成功"的确定性。 业界有三条主流路线:分片并行上传、断点续传、文件秒传,实战中常组合使用,但解决的问题各有侧重。
原理: 前端把文件切成固定大小的分片(比如每片 5M),并发上传,每片带序号和文件指纹;服务端收齐所有分片后按序合并。单点故障只影响一个分片,重传粒度从"整个文件"降到"一个分片"。
优点:
缺点:
适用场景: 所有大文件上传的基础方案。配合对象存储的原生分片接口(S3 Multipart、COS 分块上传)使用,服务端复杂度能降一大半。
原理: 在分片基础上,上传前向服务端查询"这个文件传了哪些分片",已传成功的分片直接跳过,只补传缺失部分。刷新页面、断网重连、隔天再传,都接着上次的进度走。
优点:
缺点:
适用场景: 现场环境差的上传场景:工厂车间、工地、移动网络。质检视频、巡检录像这类"必须传上去"的业务文件,断点续传是刚需不是加分项。
原理: 上传前先计算文件指纹(MD5、SHA-256 或分片采样哈希),向服务端查询指纹是否存在;已存在则直接建立文件引用,跳过传输过程。同一个文件,第二个上传的人"秒传"。
优点:
缺点:
适用场景: 重复率高的业务场景:标准图纸分发回传、培训视频多网点上传、模板类文件。重复率低的场景收益有限,别为了秒传而秒传。
场景特征 | 推荐方案 |
|---|---|
通用大文件上传基线 | 分片并行上传 |
弱网环境、必须传成的业务文件 | 分片 + 断点续传 |
文件重复率高、带宽敏感 | 叠加文件秒传 |
成熟方案通常是三件套:指纹先行(能秒传就不传),传则分片(并发提速),断则续传(失败可恢复)。对象存储的 SDK 大多内置了这三件套,自研前先看云厂商给了什么。
第一件:分片大小要权衡。 分片太小(1M 以下),请求数量爆炸,HTTP 开销吃掉收益;太大(50M 以上),单分片失败成本回升。公网环境 5M 到 10M 是经验甜区,内网可以适当放大。
第二件:垃圾分片要有清理机制。 用户传了一半永远不回来,分片就成了存储垃圾。上传会话设过期时间(比如 7 天),过期分片定时清理,存储账单才不会悄悄长胖。
第三件:安全校验不能省。 文件类型白名单、病毒扫描、大小限制,在合并完成后、正式入库前执行。分片上传把文件拆散了,安全校验的时机设计不对,恶意文件可能绕过检查。
大文件上传的技术核心就一句话:把一次大赌博拆成多次小确幸。分片解决"失败成本",续传解决"环境恶劣",秒传解决"重复浪费",按需取用。但比技术方案更重要的是运维细节:分片清理、指纹设计、安全校验,这些才是上线后真正见功夫的地方。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。