分片上传解决什么
大对象一次性上传有两个硬问题:网络中断就得从头再来,单个流也吃不满带宽。分片上传把对象切成多块并行传输,每块独立确认,最后再请求合并成完整对象;中途失败只需重传失败的分片。代价是产生了中间状态:在合并完成前对象不可见,而未完成的上传会持续占用存储空间。
基本信息
| 适用平台 | 兼容 S3 的对象存储 |
|---|---|
| 三个步骤 | 初始化获得上传标识、按分片号上传、完成合并 |
| 关键限制 | 分片数量与单片大小有限制(以官方文档为准) |
| 清理动作 | 放弃上传需显式中止,否则残留分片持续占容量 |
典型使用场景
- 超大文件上传:数据包、镜像、视频等超过单次上传便利范围的场景
- 弱网环境:断点续传,失败只重传个别分片
- 高带宽利用:多个分片并行上传,缩短整体传输时间
- 浏览器直传:前端把大文件切片后逐片上传,配合预签名链接
- 迁移同步:大批量对象搬迁时靠分片与并行提升吞吐
分片流程
分片流程
# 1) 初始化,拿到上传标识
aws s3api create-multipart-upload --bucket demo-bucket --key big.iso
# 2) 逐片上传,记录每片返回的标识
aws s3api upload-part --bucket demo-bucket --key big.iso --part-number 1 \
--upload-id <上传标识> --body part01
# 3) 列出已上传分片,核对是否齐全
aws s3api list-parts --bucket demo-bucket --key big.iso --upload-id <上传标识>
# 4) 完成合并,提交分片清单
aws s3api complete-multipart-upload --bucket demo-bucket --key big.iso --upload-id <上传标识> \
--multipart-upload file://parts.json
# 5) 放弃上传(异常中断后的清理)
aws s3api abort-multipart-upload --bucket demo-bucket --key big.iso --upload-id <上传标识>分片参数与判读
| 项 | 含义 | 注意事项 |
|---|---|---|
| 分片号 | 标识分片顺序 | 必须连续且顺序正确,缺片无法合并 |
| 分片标识 | 每片返回的校验标识 | 合并时需按分片号顺序提交 |
| 分片大小 | 除最后一片外有最小限制 | 过小会被拒绝,建议按固定大小切分 |
| 分片数量 | 有上限约束 | 数量超限需加大单片大小 |
| 合并后标识 | 与单片校验值算法不同 | 不能等同于整体内容的简单摘要 |
工程实践建议
- 分片大小固定并留出并行度,兼顾重传代价与并发连接数
- 把上传标识与已完成分片号持久化,进程重启后才能继续续传
- 失败路径一定要触发中止操作,或配置生命周期规则自动清理残留
- 完成合并后核对对象大小与校验值,确认拼接结果正确
- 上传过程中不要改动键名或目标桶,否则分片与被合并对象对不上
未完成的分片上传在对象列举里看不到,却实实在在占用容量;这是对象存储费用异常最常见的原因之一。
不同实现对分片大小、数量上限与校验算法的要求略有差别,实现上传客户端前先核对目标存储的官方文档。