# Amazon S3 多部分上传:高效处理大文件与中断恢复指南
## 摘要
本文基于 Amazon S3 官方文档,详解如何利用多部分上传(Multipart Upload)机制安全、高效地处理超过 100MB 的大文件。重点阐述网络中断后的断点续传策略、存储计费控制流程以及 Glacier 类存储桶的特殊计费规则。
## 核心优势与适用场景
Amazon S3 的多部分上传允许将单个对象拆分为多个连续的数据块(Parts),独立上传并按任意顺序组合。该机制特别适用于 100MB 及以上的大文件传输。其核心优势包括:
- **提升吞吐量**:支持并行上传各个部分,充分利用高带宽网络。
- **快速恢复**:较小的部分尺寸意味着网络错误仅影响当前部分,无需从头开始整个对象上传。
- **暂停与恢复**:发起多部分上传后无过期时间限制,可随时暂停并在后续继续。
## 中断后的断点续传策略
当网络中断导致部分传输失败时,正确的做法是仅重传失败的特定部分,而非重新上传整个对象。具体操作流程如下:
1. **记录关键信息**:在上传每个部分时,必须记录该部分的编号(Part Number)和返回的 ETag 值。每个部分拥有独立的 ETag。
2. **独立重试**:若某部分上传失败,只需针对该部分重新发起 `UploadPart` 请求。其他已成功上传的部分不受影响。
3. **完成上传**:待所有部分(包括重传成功的部分)上传完毕后,使用 `CompleteMultipartUpload` API 提交包含所有部分编号及对应 ETag 值的列表,由 S3 将各部分按顺序拼接成完整对象。
> **注意**:切勿依赖 `ListParts` 的返回结果来构建完成请求。文档明确指出,该操作返回的列表可能不包含尚未上传完成的部分。开发者必须自行维护已上传部分的编号和 ETag 记录。
## 停止上传与计费管理
多部分上传过程中,S3 会保留所有已上传的部分直到上传被明确完成或停止。在此期间,用户需为这些部分支付存储、流量及请求费用。若需停止上传以释放资源并避免持续计费,必须执行以下操作:
### 标准流程(通用存储桶)
1. **调用中止接口**:使用 `AbortMultipartUpload` API 显式终止多部分上传。
2. **清理资源**:S3 将删除所有上传的部分及相关中间数据。
3. **停止计费**:一旦中止,不再对未完成的对象部分收取存储费用。无论之前指定的存储类别如何,均无提前删除的额外费用。
### Glacier 类存储桶的特殊计费规则
对于 S3 Glacier Flexible Retrieval 或 S3 Glacier Deep Archive 存储桶,计费逻辑有所不同:
- **上传期间**:在 `CreateMultipartUpload` 和 `UploadPart` 阶段,即使目标存储类别为 Glacier,部分数据仍按 S3 Standard(标准)存储费率计费,并存储在 Glacier 灵活检索的临时存储层中。
- **完成时刻**:仅当调用 `CompleteMultipartUpload` 成功时,对象才会正式归档至指定的 Glacier 存储类别,此时才按 Glacier 的实际费率计费。
- **中止操作**:若在中止多部分上传后,之前上传的部分不会被自动归档,而是被直接删除,因此不会产生额外的归档费用或提前删除费用。
## 最佳实践建议
- **生命周期规则**:为最小化存储成本,建议在桶的生命周期配置中设置规则,使用 `AbortIncompleteMultipartUpload` 动作在指定天数后自动删除未完成的多部分上传。
- **权限控制**:确保用户拥有 `s3:AbortMultipartUpload` 权限才能中止上传。默认情况下,桶所有者和上传者拥有此权限,但 VPC 端点策略可能限制该权限,需根据实际环境配置。
- **校验和验证**:建议在发起上传时指定校验和算法(如 CRC-64/NVME),并在完成时进行完整性验证,确保数据一致性。