项目产品
开发者文档 / 8 分钟阅读

从环境变量读取配置,避免硬编码敏感信息

一、结论

用Python调用接口获取S3存储桶的对象列表,核心基于标准S3协议实现,无需适配专有接口,只需提前获取Endpoint、AccessKey、SecretKey、Bucket、Region等核心配置参数,即可通过通用S3 SDK发起请求,完成对象列表拉取、分页查询、前缀筛选等操作。所有兼容标准S3协议的存储服务都可以使用同一套代码逻辑调用,大幅降低跨平台适配成本。

二、适合哪些开发场景?

  • 网站文件上传:后端集成S3接口后,可自动将用户上传的图片、附件等静态资源存入存储桶,无需占用服务器本地存储,也方便后续资源管理分发。
  • 程序附件存储:自研App、SaaS系统的用户上传附件、产品素材等资源,统一存到S3存储桶,实现存储和业务服务解耦。
  • 图床上传:个人或商用图床的批量文件管理、自动同步、列表查询等功能,可通过S3接口快速实现。
  • 下载站资源管理:下载站的软件、压缩包等大文件统一存储到S3,通过接口拉取资源列表同步到站点前台,无需手动更新。
  • Cloudreve、Alist等网盘系统存储源:这类开源网盘程序原生支持S3协议接入,配置完成后即可直接读取存储桶内的对象列表,作为网盘的底层存储。
  • WordPress、Halo等网站附件存储:对应CMS的S3附件插件可自动将站点上传的图片、附件同步到存储桶,同时同步资源列表到后台管理界面。
  • 自动化脚本上传下载:比如定时备份服务器日志、数据库文件到S3的Python脚本,可通过拉取对象列表验证备份是否成功、清理过期备份文件。
  • App或SaaS文件管理:面向C端用户的文件管理类应用,可通过S3接口为不同用户分配独立前缀的存储路径,拉取对应路径下的对象列表展示给用户。
  • AI数据或模型文件存储:AI训练数据集、模型文件统一存到S3存储桶,训练脚本可通过接口拉取文件列表,按需加载对应数据集或模型版本。

三、常见接入方式

方式1:S3 SDK

Python生态中最常用的是AWS官方的boto3 SDK,全量支持S3标准接口,不仅可以拉取对象列表,还可以实现上传、下载、权限设置、生命周期管理等全链路操作,适合嵌入自研业务代码、自动化脚本中,灵活性最高。

方式2:S3 客户端工具

比如S3 Browser、Cyberduck等图形化客户端,适合开发者在编写代码前先测试配置是否正确,确认存储桶权限、对象列表读取正常后再做代码开发,降低调试成本。

方式3:rclone / s3cmd 等工具

适合同步、迁移和批量管理文件,也可以通过Python调用这些工具的命令行接口完成批量操作,不用自己写复杂的分片上传、断点续传、批量删除等逻辑,适合运维场景使用。

方式4:支持S3 的第三方程序

适合Cloudreve、Alist、PicGo、Halo、WordPress插件等程序接入,只要在程序后台填写好S3配置即可直接使用,无需自己编写Python代码,适合不想做二次开发的站长。

四、核心配置项说明

  • Endpoint:S3服务的接入地址,由存储服务商提供,使用非AWS的兼容S3存储时,需要替换为对应服务商的Endpoint,不要使用AWS默认地址。
  • AccessKey:身份校验的公钥,和SecretKey配对使用,相当于访问S3服务的账号,不能硬编码到公开的代码仓库中,建议存到环境变量或配置中心管理。
  • SecretKey:身份校验的私钥,相当于访问密码,泄露后会导致存储数据被篡改、删除或盗刷流量,建议使用最小权限的子账号密钥做业务调用。
  • Bucket:存储桶的名称,创建时自定义,在同一存储服务内全局唯一,拉取对象列表时需要指定对应的存储桶名称。
  • Region:存储桶所在的区域标识,部分云服务商可能不需要填写,填写时需要和创建存储桶时选择的区域一致,否则会请求失败。
  • Object Key:对象在存储桶内的唯一路径,相当于文件的完整路径,拉取列表时可以指定前缀来筛选某个目录下的对象,不用拉取全桶文件。
  • 访问权限:存储桶和对象都可以设置独立的访问权限,拉取列表的账号需要拥有s3:ListBucket权限才能正常获取对象列表,否则会返回无权限报错。
  • 文件访问地址:对象的访问外链,可以使用服务商默认的地址,也可以绑定自定义域名,用于前端直接加载资源或作为下载链接使用。

五、通用接入流程

1. 创建或准备 Bucket:提前在存储服务商控制台创建存储桶,设置好基础权限、跨域规则、生命周期策略等,如果使用已有的存储桶,需要确认当前账号拥有该桶的列表读取权限。

2. 获取 S3 接入信息:从服务商控制台复制Endpoint、AccessKey、SecretKey、Region、Bucket名称等核心参数,建议使用仅拥有对应桶读写权限的子账号密钥,不要使用管理员账号密钥。

3. 选择接入方式:如果是自研Python程序,安装boto3 SDK;如果是使用第三方程序,在后台选择S3兼容存储类型的接入选项。

4. 填写配置参数:将之前获取的核心参数填入对应的配置项,注意不要遗漏Endpoint配置,非AWS的S3兼容服务必须手动指定Endpoint。

5. 上传测试文件:可以先通过控制台上传几个测试文件到存储桶的指定目录下,方便后续验证列表拉取结果是否正确。

6. 测试功能可用性:运行简单的测试代码拉取对象列表,确认返回的文件名称、大小、修改时间等信息和控制台一致,同时测试文件下载、外链访问是否正常。

以下是通用的Python测试代码示例,所有兼容标准S3协议的存储都可以直接使用:

```python

import boto3

import os

s3_client = boto3.client(

's3',

endpoint_url=os.getenv('S3_ENDPOINT'),

aws_access_key_id=os.getenv('S3_ACCESS_KEY'),

aws_secret_access_key=os.getenv('S3_SECRET_KEY'),

region_name=os.getenv('S3_REGION', '') # 部分服务商不需要Region可留空

)

拉取存储桶指定目录下的对象列表

response = s3_client.list_objects_v2(

Bucket=os.getenv('S3_BUCKET'),

Prefix='test/', # 可选,筛选test目录下的文件,不需要筛选可删除该参数

MaxKeys=100 # 可选,单页返回的最大文件数量

)

遍历输出对象信息

if 'Contents' in response:

for obj in response['Contents']:

print(f"文件路径:{obj['Key']},文件大小:{obj['Size']}字节,最后修改时间:{obj['LastModified']}")

```

7. 接入实际业务流程:测试通过后,将列表拉取逻辑集成到实际业务中,添加异常捕获、分页查询、错误重试等逻辑即可上线使用。

六、更简单的接入方案

如果不想自己搭建维护MinIO、Ceph这类自建S3存储服务,不用处理存储扩容、硬件故障、流量带宽、安全防护等运维问题,可以直接选择成熟的兼容S3协议的云对象存储服务,开箱即用,大幅降低运维成本。

如果你需要支持标准S3协议、适合开发者接入、网盘系统存储源、图床和下载分发的对象存储服务,可以了解 七彩云对象存储,它支持低门槛接入,适合各类需要S3 API调用、文件存储分发的开发场景。

七、FAQ

Q:调用list_objects接口只能返回1000个对象怎么办?

A:标准S3协议的list_objects接口默认单页最多返回1000个对象,如果存储桶内的文件超过1000个,需要使用list_objects_v2接口的ContinuationToken参数做分页查询,每次请求拿到返回的NextContinuationToken作为下一次请求的入参,直到返回的IsTruncated为false即可拉取全量列表。

Q:配置参数都正确还是提示无权限拉取对象列表?

A:首先检查你的AccessKey对应的账号是否分配了s3:ListBucket权限,部分存储服务商默认新建的子账号没有分配列表权限,需要在控制台的权限策略里添加对应存储桶的ListBucket权限;另外确认存储桶的公共访问策略是否禁止了匿名列表访问,私有桶必须使用签名后的请求才能拉取列表。

Q:拉取对象列表的时候可以只返回特定后缀的文件吗?

A:标准S3接口没有直接提供按后缀筛选的参数,你可以先拉取指定前缀的对象列表,然后在本地代码里过滤Object Key的后缀即可,比如筛选.png结尾的图片文件,这种方式对于大部分中小规模的存储桶来说性能足够,不会有明显的延迟。

Q:用boto3调用兼容S3的第三方存储需要额外安装其他插件吗?

A:不需要,只要第三方存储完全兼容标准S3协议,直接使用原生boto3库即可,只需要在初始化client的时候指定正确的endpoint_url参数,不需要修改其他调用逻辑,也不用安装额外的依赖包。

Q:拉取对象列表会产生流量费用吗?

A:大部分云对象存储服务的API调用会收取少量的请求费用,内网调用不会产生流量费用,公网调用的话仅产生API请求费用,不会产生对象的下载流量费用,只有实际下载对象内容的时候才会计算下行流量费用。

八、总结

用Python调用S3接口获取存储桶对象列表的核心是基于通用的标准S3协议,只要存储服务商兼容S3协议,就可以通过boto3等通用SDK快速实现,无需适配专有接口,不管是自研业务系统、自动化脚本,还是对接第三方网盘、图床程序,都可以使用同一套配置逻辑,大幅降低开发和运维成本。对于不想自己维护存储集群的开发者和站长来说,选择成熟的S3兼容云对象存储服务,可以更专注于业务逻辑开发,不用处理存储扩容、故障修复、带宽调度等底层运维问题。

想进一步了解这个项目?

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

访问官网

相关文章

开发者文档 / / 8 分钟阅读

S3 ListObjects接口使用方法

一、结论 S3 ListObjects(及迭代版本ListObjectsV2)是标准S3协议下用于列举存储桶内对象的核心接口,接入调用前需提前准备Endpoint、AccessKey、SecretKey、Bucket、Region等核心身份与配置参数,可通过兼容S3的SDK、命令行工具或第三方程序调用,满足对象批量查询、自动化文件管理、存储资源盘点等需求。

开发者文档 / / 8 分钟阅读

Node.js怎么调用S3接口实现大文件分片上传

一、结论 Node.js调用S3接口实现大文件分片上传,核心是使用兼容标准S3协议的官方或第三方SDK,提前准备好Endpoint、AccessKey、SecretKey、Bucket、Region等核心参数,按照分片初始化、分片上传、分片合并的标准流程调用接口即可实现,不需要适配私有API,可直接对接所有支持S3协议的对象存储服务。

开发者文档 / / 7 分钟阅读

Go语言实现大文件分片上传到S3的代码示例

一、结论 使用Go语言实现大文件分片上传到S3兼容对象存储,核心是先获取对应存储服务的Endpoint、AccessKey、SecretKey、Bucket、Region等核心配置,再基于标准S3协议的官方SDK开发上传逻辑即可,所有兼容S3协议的对象存储服务都可以通用这套实现,不需要额外适配非标准接口。

开发者文档 / / 7 分钟阅读

ThinkPHP项目怎么接入S3兼容存储

一、结论 ThinkPHP项目接入S3兼容存储的核心逻辑是基于标准S3协议对接,无需适配私有接口,只需提前获取Endpoint、AccessKey、SecretKey、Bucket、Region这5项核心参数,即可通过兼容S3的SDK、第三方扩展或程序插件完成配置,实现文件上传、下载、外链分发、批量管理等全量功能,所有支持标准S3协议的存储服务均可通用对接。

开发者文档 / / 7 分钟阅读

前端页面大文件直传S3怎么实现

一、结论 前端页面实现大文件直传S3的核心思路是让前端直接与S3兼容存储服务交互,无需经过业务服务器中转,可大幅节省自身服务器带宽与存储资源。操作前需提前准备好S3协议所需的Endpoint、AccessKey、SecretKey、Bucket、Region等配置信息,完成权限和跨域配置后即可接入前端上传逻辑实现大文件传输。