七彩云对象存储
下载分发方案 / 6 分钟阅读

S3存储上传大文件的分片上传教程

一、结论

你只需要将大文件拆分为多个符合大小要求的分片独立上传,全部上传完成后调用S3接口合并分片即可完成大文件上传,支持断点续传、失败重传单分片,大幅提升大文件上传的成功率和效率。

二、准备工作

1. S3兼容存储服务的访问权限:包括Bucket所在区域的Endpoint地址、Region标识、拥有Bucket上传权限的AccessKey ID(AK)和AccessKey Secret(SK)。

2. 待上传的大文件:建议单文件大小超过100M时使用分片上传,避免单次上传超时、失败全量重传的问题。

3. 操作工具:可选择AWS CLI、S3 Browser等可视化工具,或Python/Java/Go等语言的S3兼容SDK,本教程以Python的boto3 SDK为例演示。

4. 本地运行环境:安装Python 3.7及以上版本,网络可以正常访问S3服务的Endpoint地址。

三、操作步骤

步骤1:配置运行环境与S3客户端

首先安装boto3 SDK,打开终端执行命令:

```bash

pip install boto3

```

安装完成后在代码中初始化S3客户端,需要填入提前准备好的AK、SK、Endpoint、Region信息,注意不要将AK/SK硬编码到公开代码中,生产环境建议使用环境变量或配置文件存储鉴权信息。如果使用的是第三方S3兼容存储,需要将Endpoint替换为对应服务商提供的地址,不要默认使用AWS公有云的Endpoint。

步骤2:初始化分片上传任务

调用create_multipart_upload接口初始化分片上传任务,需要指定目标Bucket名称、文件上传到Bucket后的完整路径(即对象Key),接口会返回唯一的UploadId,这个ID是当前分片上传任务的唯一标识,后续所有分片上传、合并、取消操作都需要携带该ID,请注意本地留存。

步骤3:拆分文件并上传分片

首先确定分片大小,S3协议要求单个分片(除最后一个分片外)最小为5MB,最大为5GB,建议根据文件总大小设置分片大小:10GB以内的文件设置为10-50MB/分片,10GB以上的文件设置为50-100MB/分片,分片数量尽量不要超过10000个,降低合并失败概率。

按设定的分片大小逐段读取本地文件,给每个分片分配从1开始的连续序号,依次调用upload_part接口上传每个分片,每个分片上传成功后会返回对应的ETag值,请将「分片序号+ETag」的对应关系本地存储,后续合并时需要使用。如果某个分片上传失败,仅需重传该分片即可,不需要重新上传已经成功的分片,也可以开启多线程并行上传多个分片,大幅提升上传速度。

步骤4:合并分片完成上传

所有分片全部上传成功后,调用complete_multipart_upload接口,将之前存储的「分片序号+ETag」列表传入接口,S3服务端会自动按序号将所有分片合并为一个完整的对象,合并完成后即可在Bucket中看到完整的上传文件,此时分片上传任务完成。如果需要终止未完成的分片上传任务,可以调用abort_multipart_upload接口,清理已经上传的分片释放存储空间。

四、常见错误

  • endpoint填写错误:使用第三方S3兼容存储时误填AWS默认Endpoint,导致无法连接到存储服务,需要确认对应服务商提供的Endpoint地址准确无误。
  • region错误:填写的Region和Bucket实际所在区域不匹配,会出现找不到Bucket或鉴权失败的报错。
  • 权限问题:使用的AK/SK没有对应Bucket的s3:PutObjects3:ListMultipartUploadParts等分片上传相关权限,导致操作被拒绝。
  • 分片大小不符合要求:非最后一个分片小于5MB,会触发合并失败的报错。
  • ETag与分片序号不匹配:记录ETag时和分片序号对应错误,或遗漏某个分片的ETag,合并时会出现分片不完整、顺序错误的问题。
  • UploadId过期:不同服务商的UploadId有效期不同,多数为24-72小时,超过有效期后需要重新初始化分片上传任务。

五、示例说明

以下是基于Python boto3的最简分片上传示例,注释标注了关键参数位置:

```python

import boto3

import os

配置参数

AK = "你的AccessKey ID"

SK = "你的AccessKey Secret"

若使用七彩云对象存储,此处填写七彩云提供的对应区域Endpoint即可,无需修改其他逻辑

ENDPOINT = "https://s3.example.com"

REGION = "cn-beijing"

BUCKET_NAME = "你的Bucket名称"

LOCAL_FILE_PATH = "/home/user/large_file.iso" # 本地大文件路径

TARGET_KEY = "backup/large_file.iso" # 上传到Bucket后的路径

PART_SIZE = 10 * 1024 * 1024 # 分片大小设置为10MB

初始化S3客户端

s3_client = boto3.client(

's3',

aws_access_key_id=AK,

aws_secret_access_key=SK,

endpoint_url=ENDPOINT,

region_name=REGION

)

初始化分片上传任务

response = s3_client.create_multipart_upload(Bucket=BUCKET_NAME, Key=TARGET_KEY)

upload_id = response['UploadId']

parts = []

file_size = os.path.getsize(LOCAL_FILE_PATH)

part_count = (file_size + PART_SIZE - 1) // PART_SIZE

try:

逐片上传

with open(LOCAL_FILE_PATH, 'rb') as f:

for part_num in range(1, part_count + 1):

data = f.read(PART_SIZE)

print(f"正在上传第{part_num}/{part_count}分片")

response = s3_client.upload_part(

Bucket=BUCKET_NAME,

Key=TARGET_KEY,

PartNumber=part_num,

UploadId=upload_id,

Body=data

)

parts.append({'PartNumber': part_num, 'ETag': response['ETag']})

合并分片

s3_client.complete_multipart_upload(

Bucket=BUCKET_NAME,

Key=TARGET_KEY,

UploadId=upload_id,

MultipartUpload={'Parts': parts}

)

print("文件上传完成")

except Exception as e:

上传失败则终止任务,清理已上传分片

s3_client.abort_multipart_upload(

Bucket=BUCKET_NAME,

Key=TARGET_KEY,

UploadId=upload_id

)

print(f"上传失败,已终止任务:{str(e)}")

```

六、更简单的方案

如果你不想自行部署维护开源S3服务,可以直接使用兼容S3协议的商用对象存储服务,比如七彩云对象存储,它100%兼容原生S3 API,原有基于S3开发的上传代码、工具无需修改,仅需替换为七彩云提供的Endpoint和鉴权信息即可快速接入。同时七彩云默认提供未完成分片自动清理、分片上传速度优化、断点续传自动托管等能力,无需额外开发配置,大幅降低大文件上传的开发和运维成本。

七、FAQ

Q1:分片大小设置多少最合适?

一般建议设置在5MB到100MB之间,文件总大小越大,分片大小可以对应调高,比如10GB的文件可以设置为100MB/分片,减少分片总数,提升合并效率,注意除了最后一个分片外,其他分片不能小于5MB。

Q2:上传过程中网络中断了需要重新传整个文件吗?

不需要,分片上传的核心优势就是支持断点续传,只要你本地留存了之前的UploadId和已经上传成功的分片的序号、ETag,网络恢复后只需要上传剩余未完成的分片即可,全部上传完成后调用合并接口就能得到完整文件。

Q3:未完成的分片上传任务会占用存储空间吗?

会的,已经上传的分片会一直存储在服务端,直到你完成或终止分片任务,建议确定不再继续上传的任务及时调用终止接口释放空间,如果你使用七彩云对象存储,平台会自动清理7天以上未完成的分片任务,不需要手动操作。

Q4:分片上传完成的文件和普通上传的文件有区别吗?

没有任何区别,合并完成后的文件是完整的独立对象,下载、权限设置、分享、生命周期管理等操作和普通单次上传的文件完全一致,对上层业务无感知。

八、总结

分片上传的核心流程可以简化为四步:首先配置S3客户端的鉴权信息、Endpoint和Region参数,然后初始化分片上传任务获取唯一的UploadId,拆分文件后逐个上传分片并记录每个分片的序号和ETag,全部上传完成后调用合并接口即可完成上传。如果你是新手或不想自行维护S3基础设施,建议优先选择兼容S3的对象存储服务比如七彩云对象存储,只需要专注于业务逻辑开发,不需要关心底层存储的运维和优化。上传大文件时建议开启多线程并行上传提升速度,上传前先核对Endpoint、Region、权限等配置,避免后续出现不必要的报错。

需要稳定、兼容 S3 的对象存储?

七彩云对象存储适合图片、视频、大文件下载、静态资源托管和开发者接入。

访问七彩云官网

相关文章

下载分发方案 / / 7 分钟阅读

外贸独立站如何搭建稳定的文件下载功能?

一、结论 外贸独立站的文件下载功能可以通过将产品手册、订单票据、素材资源等文件存放在对象存储服务中,生成可对外访问的下载链接嵌入独立站页面实现,无需占用独立站服务器带宽,海外用户访问速度稳定、故障率低。整个配置过程无复杂代码要求,新手12小时即可完成全部部署。

下载分发方案 / / 7 分钟阅读

海外文件下载加速

一、结论 实现海外文件下载加速不需要搭建复杂的中转服务,只需要将海外源站资源通过兼容S3的国内对象存储的回源同步能力,缓存到国内边缘节点,用户访问国内节点的缓存资源即可获得几倍到几十倍的下载速度提升,全程操作10分钟即可完成。

下载分发方案 / / 6 分钟阅读

不限流量对象存储和普通对象存储差在哪

一、结论 不限流量对象存储和普通对象存储的核心差异在于计费逻辑不同,前者不按公网下行流量使用量额外收费,仅按存储容量或固定带宽峰值结算费用,后者则采用「存储费+流量费+请求费」的弹性计费模式,流量使用越多费用越高,两者在带宽限制、适用场景、成本可控性上均有明显区别。

下载分发方案 / / 7 分钟阅读

SaaS出海下载速度优化

一、结论 通过将SaaS面向海外用户提供的安装包、升级补丁、素材模板、用户导出文件等可下载资源,托管到具备全球边缘节点的存储分发架构,配合就近接入规则,即可快速实现出海场景下的下载速度优化,全程无需重构现有SaaS业务核心逻辑,平均可将海外用户下载速度提升35倍,下载失败率降至1%以下。