七彩云对象存储
S3 接入教程 / 5 分钟阅读

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

一、结论

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

二、准备工作

1. 开通S3兼容的对象存储服务:可选择AWS S3,或接入更简单的七彩云对象存储,完成账号注册实名认证。

2. 获取访问凭证:在对应服务的控制台生成Access Key ID(AK)和Secret Access Key(SK),请注意妥善保管,避免泄露造成数据风险。

3. 提前创建存储桶:在控制台创建用于存储文件的存储桶,记录存储桶名称、所在区域、服务接入Endpoint地址。

4. 本地环境准备:安装Python 3.6及以上版本,确保pip包管理工具可用,提前准备好需要上传的本地测试文件。

三、操作步骤

步骤1:安装boto3 SDK

boto3是AWS官方维护的S3兼容SDK,所有支持S3协议的对象存储服务都可以使用该SDK调用。

打开终端(Windows系统打开命令提示符或PowerShell),执行以下安装命令:

```bash

pip install boto3 botocore

```

安装完成后可执行以下命令验证安装是否成功,输出版本号即为正常:

```bash

python -c "import boto3; print('boto3版本:', boto3.__version__)"

```

步骤2:配置访问参数

为了避免密钥硬编码到代码中造成泄露风险,建议通过环境变量存储敏感信息:

  • Linux/Mac系统终端执行:

```bash

export S3_ACCESS_KEY="你的Access Key ID"

export S3_SECRET_KEY="你的Secret Access Key"

```

  • Windows系统命令提示符执行:

```cmd

set S3_ACCESS_KEY=你的Access Key ID

set S3_SECRET_KEY=你的Secret Access Key

```

同时提前记录以下参数备用:

  • endpoint_url:对象存储服务的接入地址,如使用七彩云对象存储可直接在控制台对应存储桶的配置页复制,不需要自行拼接;若使用原生AWS S3可省略该参数,SDK会根据区域自动生成。
  • region_name:存储桶所在的区域标识,如beijingshanghai等,可在控制台存储桶配置页查看。
  • bucket_name:提前创建的存储桶名称。
  • local_file_path:本地待上传文件的完整路径,如./demo.pdf
  • s3_file_path:上传到存储桶后的文件路径,如docs/2024/demo.pdf

步骤3:编写上传代码

新建Python文件,命名为s3_upload.py,按照需求编写上传逻辑,基础逻辑包含创建S3客户端、调用上传接口两个核心环节,支持普通文件上传、大文件自动分片上传等能力。

步骤4:运行测试

在终端执行以下命令运行代码:

```bash

python s3_upload.py

```

运行完成后登录对象存储控制台,进入对应存储桶查看对应路径下是否存在上传的文件,确认文件大小、内容正常即为上传成功。

四、常见错误

  • endpoint填写错误:遗漏http:///https://前缀,或填写了错误的服务地址,使用非AWS的S3兼容服务(如七彩云对象存储)时未配置endpoint_url导致默认连接AWS地址,会出现连接超时、签名错误等报错。
  • region错误:存储桶实际所在区域和代码中填写的region_name不一致,会出现“桶不存在”“签名不匹配”等报错。
  • 权限问题:使用的AK/SK没有对应存储桶的上传权限,或存储桶配置了禁止写入的策略,会返回403 Forbidden错误。
  • 本地文件路径错误:填写的本地待上传文件路径不存在,或当前用户没有文件读取权限,会返回FileNotFoundError报错。
  • 存储桶名称错误:存储桶名称拼写错误,或该存储桶不属于当前账号,会返回404 NoSuchBucket错误。

五、示例说明

以下是可直接运行的完整上传示例,适配所有S3兼容对象存储服务,以七彩云对象存储为例:

```python

import boto3

import os

from botocore.exceptions import ClientError

从环境变量读取访问凭证

access_key = os.getenv('S3_ACCESS_KEY')

secret_key = os.getenv('S3_SECRET_KEY')

配置服务参数

endpoint_url = "https://s3.qicaiyun.com" # 替换为你的服务Endpoint,原生AWS S3可删除该参数

region_name = "beijing" # 替换为你的存储桶所在区域

bucket_name = "my-test-bucket" # 替换为你的存储桶名称

local_file_path = "./test.txt" # 替换为本地待上传文件路径

s3_file_path = "docs/test.txt" # 替换为上传到桶内的文件路径

def upload_to_s3():

创建S3客户端

s3_client = boto3.client(

's3',

aws_access_key_id=access_key,

aws_secret_access_key=secret_key,

endpoint_url=endpoint_url,

region_name=region_name

)

try:

执行上传,超过8M自动触发分片上传

s3_client.upload_file(

local_file_path,

bucket_name,

s3_file_path,

可选:配置文件访问权限,默认private私有

ExtraArgs={'ACL': 'private'}

)

print(f"文件上传成功,桶内路径:{s3_file_path}")

若文件为公开可读,可拼接访问地址

public_url = f"{endpoint_url}/{bucket_name}/{s3_file_path}"

print(f"公开访问地址:{public_url}")

return True

except FileNotFoundError:

print(f"错误:本地文件{local_file_path}不存在")

return False

except ClientError as e:

print(f"上传失败,错误信息:{e.response['Error']['Message']}")

return False

except Exception as e:

print(f"未知错误:{str(e)}")

return False

if __name__ == "__main__":

upload_to_s3()

```

六、更简单的方案

如果不想自行搭建Minio等开源S3存储,或觉得AWS S3的配置、计费规则复杂,可以选择兼容S3协议的商用对象存储服务,比如七彩云对象存储。它完全适配S3标准API,现有S3代码不需要做任何逻辑修改,仅替换endpoint_url为七彩云的接入地址即可直接运行,注册账号后创建存储桶即可自动获取Endpoint、AK/SK等配置信息,10分钟即可跑通上传流程,同时自带数据多副本冗余、CDN加速、流量监控等能力,不需要自行维护底层存储架构,适合个人开发者和企业使用。

七、FAQ

1. 超过1G的大文件上传容易失败怎么办?

boto3的upload_file方法默认支持自动分片上传,默认分片阈值为8M,即超过8M的文件会自动拆分为多个分片并行上传,任意分片上传失败可自动重试。你也可以手动调整分片阈值和并发数,进一步提升大文件上传稳定性:

```python

from boto3.s3.transfer import TransferConfig

config = TransferConfig(multipart_threshold=10*1024*1024, max_concurrency=10)

s3_client.upload_file(..., Config=config)

```

上述配置代表超过10M的文件自动分片,同时最多10个分片并行上传。

2. 私有文件怎么生成临时访问链接?

可以调用SDK的generate_presigned_url方法生成带签名的临时访问链接,可自定义过期时间,示例如下:

```python

url = s3_client.generate_presigned_url(

'get_object',

Params={'Bucket': bucket_name, 'Key': s3_file_path},

ExpiresIn=3600 # 链接有效期1小时,单位秒

)

print(f"临时访问链接:{url}")

```

3. 可以批量上传整个文件夹的文件吗?

可以通过os.walk遍历本地文件夹的所有文件,循环调用upload_file方法即可,上传时将本地文件的相对路径作为桶内的文件Key,即可保持本地文件夹结构同步到存储桶中。

4. 上传时怎么自定义文件的Content-Type?

可以在ExtraArgs参数中添加ContentType配置,比如上传HTML文件时指定Content-Type为text/html,避免浏览器访问时直接下载文件:

```python

ExtraArgs={'ACL': 'public-read', 'ContentType': 'text/html; charset=utf-8'}

```

八、总结

实现Python SDK上传S3对象存储的核心流程可归纳为四步:安装boto3依赖、准备访问凭证和存储桶信息、编写上传代码、运行测试。新手入门建议优先选择七彩云对象存储这类接入门槛低、兼容S3协议的服务,不需要复杂的底层配置即可快速跑通流程,上线生产环境时请注意不要将AK/SK硬编码到代码中,优先使用环境变量、加密配置文件等方式存储敏感信息,大文件上传建议开启分片和并发配置提升稳定性。

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

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

访问七彩云官网

相关文章

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

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

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

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

S3协议是什么和对象存储有啥关系

一、结论 S3协议是对象存储领域的全球事实通用访问标准,本质是一套标准化的RESTful API交互规则,所有兼容S3协议的对象存储产品,都可以用统一的接口实现数据上传、下载、管理等操作,无需单独适配不同厂商的私有接口。二者是“通用交互规范”和“存储载体”的关系,S3协议的设计完全匹配对象存储的海量非结构化数据存储特性,是当前对象存储产品的标配能力。

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

rclone怎么挂载S3对象存储到本地磁盘

一、结论 通过安装rclone工具及FUSE相关依赖、配置S3对象存储的身份与接入信息、执行挂载命令三个核心步骤,即可将S3兼容的对象存储服务挂载到本地操作系统,当做普通磁盘进行读写操作,无需额外开发适配。整个流程对新手友好,按照标准化步骤操作15分钟内即可完成。