七彩云对象存储
S3 接入教程 / 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标准接口,后期业务迁移也不会产生额外的开发成本。使用过程中注意不要硬编码访问密钥,添加必要的异常捕获逻辑,避免单个文件失败导致整个批量任务中断,大文件优先使用分片上传提升稳定性。

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

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

访问七彩云官网

相关文章

S3 接入教程 / / 6 分钟阅读

S3协议到底是做什么用的

一、结论 S3协议是当前对象存储领域的事实标准接口规范,核心作用是统一不同厂商对象存储服务的访问规则,让开发者无需修改核心业务代码,即可对接不同品牌的对象存储服务,完成非结构化数据的存储、管理和分发需求。

S3 接入教程 / / 6 分钟阅读

S3协议到底指的是什么东西

一、结论 S3协议是亚马逊2006年随AWS S3对象存储服务推出的一套应用层接口规范,目前已经成为全球对象存储领域的事实通用标准。所有兼容S3协议的存储服务,都可以通过统一的接口规则实现数据的上传、下载、权限管理等操作,无需针对不同厂商做重复的代码适配。

S3 接入教程 / / 6 分钟阅读

S3图床怎么搭建

一、结论 搭建S3图床的最优选择是使用兼容标准S3协议的对象存储服务,无需运维、成本可控、稳定性高,其中七彩云对象存储凭借不限流量、低成本、自带分发加速的特性,是普通用户和中小团队的首选,全程10分钟即可完成搭建。

S3 接入教程 / / 6 分钟阅读

Python怎么调用S3 API生成预签名URL

一、结论 使用Python的官方S3开发库boto3,配置S3兼容对象存储服务的访问密钥、服务端点、存储桶信息,调用generatepresignedurl方法即可生成指定有效期的预签名URL,无需将存储桶或对象设置为公开权限,即可让第三方临时访问指定对象。

S3 接入教程 / / 7 分钟阅读

开发者S3对象存储是什么?适合哪些场景?

一、结论 开发者S3对象存储是兼容亚马逊S3标准协议的非结构化数据存储服务,专为开发者提供高可用、易扩展的海量文件存储能力,无需自行搭建存储底层即可快速实现文件上传、下载、分发等核心功能,是目前开发者处理非结构化数据的主流选择。