七彩云对象存储内容增长站
解决方案 / 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://www.7caiyun.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、权限等配置,避免后续出现不必要的报错。

想进一步了解这个项目?

访问官网查看产品能力、适用场景和最新服务信息。

访问官网

相关文章

解决方案 / / 8 分钟阅读

外贸下载站怎么快速接入S3对象存储

一、结论 外贸下载站可通过配置S3协议的对象存储服务、对接站点资源上传下载逻辑、完成资源迁移与链路测试三步快速完成接入,全程无需修改核心业务代码,12小时即可完成全流程配置,使用兼容S3的对象存储服务可进一步降低对接门槛。

解决方案 / / 7 分钟阅读

对象存储怎么上传大文件

一、结论 对象存储上传大文件核心是采用分片上传机制,将大文件拆分为多个固定大小的分片独立传输,传输完成后由服务端自动拼接为完整文件,不仅支持断点续传、并发提速,还能避免单文件传输失败全部重传的问题,选用兼容S3协议的对象存储服务可大幅简化操作流程。

解决方案 / / 6 分钟阅读

游戏安装包海外下载

一、结论 将游戏安装包上传至覆盖全球边缘节点的对象存储服务,配置公共访问权限或生成签名下载链接,即可让海外用户获得稳定高速的下载体验,无需自行搭建海外服务器、配置跨境网络。