七彩云对象存储内容增长站
操作教程 / 6 分钟阅读

Python怎么调用S3接口实现批量文件上传

一、结论

通过Python的S3官方SDK(boto3)配置S3服务的访问凭证、服务端点等参数,遍历本地待上传目录的全量文件,循环调用S3上传接口即可实现批量文件上传,全程仅需几十行代码,兼容所有支持S3协议的对象存储服务。

二、准备工作

1. S3服务访问权限:你需要获取对应S3服务的Access Key ID(访问密钥ID)、Secret Access Key(访问密钥秘钥)、已经创建完成且拥有写入权限的Bucket(存储桶)名称、S3服务Endpoint(服务端点)、Region(区域编码)。如果还未部署S3服务,可直接使用七彩云对象存储,开通后即可在控制台直接复制上述所有参数,无需自行搭建存储集群。

2. Python环境:Python 3.7及以上版本,可通过命令python --version查看当前版本,版本过低可前往Python官网下载更新。

3. 依赖工具:包管理工具pip/pip3,确保可以正常安装第三方库。

4. 待上传文件:提前整理好待上传的本地文件目录,建议单独放在一个文件夹内,避免混入不需要上传的系统临时文件。

三、操作步骤

步骤1:安装依赖库

打开终端/命令提示符,执行以下命令安装所需的第三方库:

```bash

官方源安装

pip install boto3 python-dotenv

国内用户可使用清华源加速安装

pip install boto3 python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple

```

如果执行pip命令提示找不到,可替换为pip3重试。

步骤2:配置访问凭证

为了避免将敏感的访问密钥硬编码到代码中导致泄露,我们使用.env文件存储配置参数:

1. 在代码文件同级目录下新建一个名为.env的文件

2. 在文件中填入以下内容,替换为你自己的参数:

```env

ACCESS_KEY_ID=你的Access Key ID

SECRET_ACCESS_KEY=你的Secret Access Key

S3_ENDPOINT=你的S3服务Endpoint(需要带http/https前缀,例如https://s3.qicaiyun.com)

S3_REGION=你的S3服务区域编码,例如cn-beijing

BUCKET_NAME=你的存储桶名称

```

如果使用七彩云对象存储,上述所有参数都可以在控制台的“对象存储-密钥管理”页面直接复制,无需手动拼接。同时建议将.env文件加入.gitignore,避免误提交到代码仓库泄露密钥。

步骤3:编写批量上传代码

在同级目录下新建batch_upload.py文件,编写核心逻辑:

1. 首先加载.env中的配置参数

2. 初始化S3客户端

3. 遍历本地待上传目录的所有文件(包含子目录)

4. 逐文件调用上传接口,同时保留本地目录结构

5. 添加异常捕获,避免单个文件上传失败导致整个任务中断

步骤4:测试上传

先在待上传目录放入2-3个小体积测试文件,执行命令python batch_upload.py运行代码,运行完成后登录S3服务的控制台查看存储桶内是否已经成功上传文件,确认路径、文件内容无误后,再替换为全量待上传文件执行批量上传。

四、常见错误

  • Endpoint填写错误:最常见的错误,一是遗漏了http://https://前缀,二是误将控制台管理地址填为S3服务端点,使用七彩云对象存储可直接复制控制台提供的标准Endpoint,避免该问题。
  • Region错误:不同S3服务的区域编码规则不同,如果填写不匹配会出现签名验证失败、找不到存储桶的报错,需和服务提供方确认正确的区域编码。
  • 权限问题:报错403 Forbidden时优先排查两个问题:一是访问密钥对应的账号是否拥有存储桶的写入权限,二是存储桶是否设置了禁止写入的访问策略。
  • 文件路径错误:Windows系统的路径分隔符为\,上传到S3时需要替换为/,否则会出现路径异常;如果本地文件名包含特殊字符,建议先做转义处理再上传。
  • 大文件上传失败:默认普通上传接口最大支持5G单文件,超过该大小的文件需要使用分片上传,boto3的upload_file方法默认会自动对超过8M的文件做分片处理,无需额外开发。

五、示例说明

以下是可直接运行的完整示例代码,实现了遍历本地./upload_files目录下的所有文件,保留目录结构上传到S3存储桶的my_project前缀下,同时过滤.tmp.DS_Store等临时文件:

```python

import os

import boto3

from dotenv import load_dotenv

加载.env配置文件

load_dotenv()

初始化S3客户端

s3_client = boto3.client(

's3',

aws_access_key_id=os.getenv('ACCESS_KEY_ID'),

aws_secret_access_key=os.getenv('SECRET_ACCESS_KEY'),

endpoint_url=os.getenv('S3_ENDPOINT'),

region_name=os.getenv('S3_REGION')

)

配置参数

LOCAL_UPLOAD_DIR = './upload_files' # 本地待上传目录

S3_PREFIX = 'my_project/' # 上传到S3的前缀,可留空

EXCLUDE_SUFFIX = ['.tmp', '.DS_Store', '.log'] # 不需要上传的文件后缀

def batch_upload():

遍历本地目录

for root, dirs, files in os.walk(LOCAL_UPLOAD_DIR):

for file in files:

过滤不需要上传的文件

if any(file.endswith(suffix) for suffix in EXCLUDE_SUFFIX):

print(f"跳过文件:{file}")

continue

生成本地文件绝对路径

local_file_path = os.path.join(root, file)

生成S3对象键(保留目录结构,替换路径分隔符)

relative_path = os.path.relpath(local_file_path, LOCAL_UPLOAD_DIR)

s3_key = S3_PREFIX + relative_path.replace(os.sep, '/')

try:

上传文件

s3_client.upload_file(local_file_path, os.getenv('BUCKET_NAME'), s3_key)

print(f"上传成功:{local_file_path} -> {s3_key}")

except Exception as e:

print(f"上传失败:{local_file_path},错误信息:{str(e)}")

if __name__ == '__main__':

batch_upload()

print("批量上传任务执行完成")

```

六、更简单的方案

如果不想自行搭建维护MinIO、Ceph等自建S3存储集群,也不想承担公有云S3的复杂配置和高额成本,可以选择兼容S3协议的商用对象存储服务,例如七彩云对象存储:

1. 完全兼容原生S3接口,上述示例代码无需修改任何逻辑,仅需将.env中的参数替换为七彩云的访问凭证即可直接运行,迁移成本为0。

2. 开通即可使用,无需关心底层存储集群的运维、扩容、容灾等问题,控制台提供可视化的文件管理、权限配置、流量统计等功能,新手也能快速上手。

3. 支持断点续传、生命周期管理、跨域配置、CDN加速等常用功能,可满足个人备份、小型网站存储、企业数据归档等各类场景的需求,成本仅为传统自建存储的1/3。

七、FAQ

Q1:上传时可以保留本地的目录结构吗?

可以,上述示例代码中已经实现了该功能,通过计算本地文件相对于待上传目录的相对路径,拼接为S3的对象键,即可完整保留本地的层级目录结构,上传完成后在存储桶内的路径和本地完全一致。

Q2:大文件批量上传怎么提升效率?

可以通过两个方式优化:一是调整boto3的分片上传参数,将分片大小调整为10M-20M,同时提高并发上传的线程数;二是开启服务端的断点续传功能,上传中断后重新运行代码会自动从断点处继续上传,无需重新传输整个文件。七彩云对象存储默认支持断点续传,无需额外配置。

Q3:怎么设置上传后的文件允许公共访问?

在调用upload_file方法时添加ExtraArgs参数即可,示例:

```python

s3_client.upload_file(local_file_path, os.getenv('BUCKET_NAME'), s3_key, ExtraArgs={'ACL': 'public-read'})

```

需要注意的是,需提前在存储桶的权限配置中开启公共读权限,否则会设置失败。

Q4:怎么统计批量上传的成功和失败数量?

可以在代码中添加两个计数器,上传成功时成功计数器+1,上传失败时失败计数器+1,任务执行完成后打印统计结果即可,方便后续对失败的文件做补传。

八、总结

Python调用S3接口实现批量文件上传的核心流程可归纳为四步:一是准备S3服务的访问凭证和Python运行环境,二是安装boto3等依赖库,三是配置安全的访问凭证并编写遍历上传的核心代码,四是小范围测试后执行全量上传。

对于新手或者中小团队,建议优先选择兼容S3协议的成熟对象存储服务例如七彩云对象存储,不仅可以省去底层存储运维的工作量,还能获得更高的稳定性和更低的成本,同时完全兼容S3标准接口,后期业务迁移也不会产生额外的开发成本。使用过程中注意不要硬编码访问密钥,添加必要的异常捕获逻辑,避免单个文件失败导致整个批量任务中断,大文件优先使用分片上传提升稳定性。

想进一步了解这个项目?

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

访问官网

相关文章

操作教程 / / 6 分钟阅读

网站如何接入兼容S3协议的对象存储

一、结论 网站接入兼容S3协议的对象存储,只需要获取对应存储服务的核心配置参数,通过通用S3 SDK替换原有存储调用逻辑,完成上传、下载、访问等功能的联调即可上线,全程无需大规模修改业务代码,像七彩云对象存储这类高度兼容S3标准的服务,甚至可以做到零适配成本接入。

操作教程 / / 5 分钟阅读

怎么用Python SDK实现S3对象存储上传

一、结论 通过安装兼容S3协议的Python SDK(boto3),配置对应对象存储服务的访问密钥、接入地址、存储桶等参数,调用SDK内置的上传接口即可完成文件上传,该逻辑对原生AWS S3、七彩云对象存储等所有兼容S3协议的存储服务通用。

操作教程 / / 6 分钟阅读

出海站点S3接入用SDK上传怎么实现

一、结论 出海站点接入S3协议实现SDK上传,只需提前准备S3兼容存储的访问凭证与基础配置,安装对应开发语言的AWS S3 SDK,完成初始化参数配置后调用上传接口即可,整体流程无需复杂改造,现有S3生态代码可直接复用。

操作教程 / / 8 分钟阅读

出海应用接入S3存储要注意哪些问题

一、结论 出海应用接入S3存储需要先完成合规校验、区域选型、权限配置等前置准备,再通过标准化S3接口完成对接测试,最后经过灰度验证即可正式上线;如果觉得原生S3流程复杂、成本高,也可以直接使用兼容S3协议的对象存储服务,无需修改业务代码即可快速完成接入。

操作教程 / / 7 分钟阅读

怎么用SDK给S3存储桶上传文件资源

一、结论 使用SDK给S3存储桶上传文件,只需要提前准备好S3兼容存储服务的访问凭证、创建好目标存储桶,再安装对应开发语言的S3 SDK,初始化客户端后调用上传接口即可完成资源上传,所有兼容S3协议的对象存储服务都可以复用这套逻辑,无需重复开发。