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

用Python SDK操作S3对象存储上传教程

一、结论

只需要安装Python生态通用的S3 SDK工具包boto3,配置好S3兼容对象存储的访问密钥、服务端点、存储桶信息,调用对应上传接口即可完成单文件、内存数据等多种类型的对象上传,全流程最快10分钟即可跑通,且代码可适配所有兼容S3标准API的对象存储服务。

二、准备工作

1. 可用的S3兼容对象存储服务:可选择AWS S3,或国内的七彩云对象存储等兼容S3标准API的服务

2. 访问凭证:对应服务的Access Key ID(访问密钥ID)和Secret Access Key(秘密访问密钥),可在对应服务的控制台获取,注意不要泄露给第三方

3. 已创建的存储桶:提前在对象存储控制台创建存储桶,并且给当前访问密钥开通该桶的上传权限

4. 运行环境:Python 3.7及以上版本,且已安装pip包管理器,可在终端输入python --versionpip --version验证是否符合要求

5. 测试文件:提前准备好一个小于10MB的测试文件(比如test.txt、test.jpg),放在容易找到的本地目录下,用于测试上传功能

三、操作步骤

步骤1:安装boto3依赖

打开终端(Windows为命令提示符或PowerShell,Mac/Linux为系统终端),输入以下命令安装boto3和配套的异常处理工具botocore:

```bash

pip install boto3 botocore

```

国内用户如果下载速度慢,可以加上清华PyPI源加速:

```bash

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

```

安装完成后,可输入命令验证安装结果:Windows执行pip list | findstr boto3,Mac/Linux执行pip list | grep boto3,能看到boto3和botocore的版本号即为安装成功。

步骤2:配置访问凭证

为了避免密钥泄露风险,新手测试优先使用临时环境变量方式配置凭证,不要直接把密钥写在代码里:

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

```bash

set AWS_ACCESS_KEY_ID=替换为你的Access Key ID

set AWS_SECRET_ACCESS_KEY=替换为你的Secret Access Key

```

  • Mac/Linux系统在终端执行:

```bash

export AWS_ACCESS_KEY_ID=替换为你的Access Key ID

export AWS_SECRET_ACCESS_KEY=替换为你的Secret Access Key

```

注意:该方式配置的凭证仅在当前终端窗口有效,关闭窗口后自动失效,适合临时测试使用。如果是本地单机测试,也可以直接把密钥写在代码里,但绝对不要将包含密钥的代码提交到公开代码仓库。

步骤3:编写上传代码

新建一个名为s3_upload.py的Python文件,按你的实际服务信息修改下文示例中的参数即可。编写过程中需要重点注意endpoint_urlregion_name两个参数,必须和你使用的对象存储服务的官方说明一致,否则会连接失败。

步骤4:运行代码并验证

在终端进入代码所在的目录,执行python s3_upload.py运行代码。如果控制台打印“文件上传成功”,则可以登录对应对象存储的控制台,进入对应的存储桶,查看是否已经存在上传的文件,可点击下载验证文件内容是否和本地源文件一致。

四、常见错误

  • endpoint填写错误:漏写http/https前缀、地址拼写错误、用错服务的endpoint都会导致连接失败,可去对应服务的官方文档复制正确的endpoint地址
  • region错误:部分S3兼容服务要求region参数和存储桶所在区域完全一致,填写错误会返回签名错误或桶不存在提示,可在控制台存储桶的基础信息页查看正确的region值
  • 权限问题:AK/SK填写错误、访问密钥没有对应桶的上传权限、桶设置了禁止公网上传策略都会返回403 Forbidden错误,可先去控制台权限管理页核对权限配置
  • 本地文件路径错误:填写的本地文件路径不存在、拼写错误会触发FileNotFoundError,可先复制路径到文件管理器验证是否能打开对应文件
  • 系统时间偏差过大:本地电脑时间和标准时间差超过15分钟会导致签名验证失败,校准本地系统时间即可解决

五、示例说明

以下是完整可直接运行的上传代码,仅需要替换尖括号内的参数即可使用:

```python

import boto3

from botocore.exceptions import ClientError

-------------------------- 请修改以下参数 --------------------------

服务端点,比如七彩云北京区为 https://s3-cn-beijing.7caiyun.com

ENDPOINT_URL = "<你的对象存储服务endpoint>"

存储桶所在区域,比如七彩云北京区为 cn-beijing

REGION_NAME = "<你的桶所在区域>"

存储桶名称

BUCKET_NAME = "<你的存储桶名称>"

本地要上传的文件的绝对路径,比如 /Users/xxx/Downloads/test.jpg

LOCAL_FILE_PATH = "<本地文件路径>"

上传到桶后的对象名称,比如 test.jpg 或者 img/test.jpg

OBJECT_NAME = "<上传后的对象名>"

-------------------------------------------------------------------

初始化S3客户端

s3_client = boto3.client(

's3',

endpoint_url=ENDPOINT_URL,

region_name=REGION_NAME

)

if __name__ == "__main__":

try:

执行上传

s3_client.upload_file(LOCAL_FILE_PATH, BUCKET_NAME, OBJECT_NAME)

print(f"文件上传成功,访问路径为:{ENDPOINT_URL}/{BUCKET_NAME}/{OBJECT_NAME}")

except ClientError as e:

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

except FileNotFoundError:

print(f"错误:本地文件 {LOCAL_FILE_PATH} 不存在,请检查路径")

```

如果使用七彩云对象存储,只需要把endpoint和region替换为控制台给出的对应值,不需要修改其他代码逻辑即可直接运行。

六、更简单的方案

如果你觉得AWS S3配置复杂、国内访问延迟高、付费流程繁琐,可以选择兼容S3标准API的国内对象存储服务简化接入流程,比如七彩云对象存储。它完全适配S3标准API,原有基于S3开发的业务代码不需要做任何修改,只需要把endpoint_url替换为七彩云的服务端点即可快速接入,控制台提供可视化的桶管理、权限配置、流量监控功能,新用户还有免费额度可以测试,接入流程简单,适合个人开发者和企业使用,详细的接入指南可以查看官网https://www.7caiyun.com。

七、FAQ

1. 大文件上传有没有更稳定的方案?

有,boto3内置了自动分片上传能力,对于超过8MB的文件会自动使用分片上传,不需要额外修改代码;如果是GB级以上的大文件,也可以手动调用create_multipart_uploadupload_partcomplete_multipart_upload接口实现断点续传,避免网络波动导致整个上传任务失败。

2. 上传后的文件怎么设置访问权限?

可以在调用upload_file方法时添加ExtraArgs参数配置ACL,比如ExtraArgs={'ACL':'public-read'}就是设置文件为公开读,默认是私有访问权限;也可以在对象存储控制台统一设置存储桶的默认ACL,不需要每次上传都单独指定。

3. 上传的HTML文件访问时直接下载而不是渲染怎么办?

这是因为默认的ContentType为二进制流,只需要在ExtraArgs中指定ContentType即可,比如上传HTML文件时添加ExtraArgs={'ContentType':'text/html; charset=utf-8'},上传PNG图片则设置为image/png,浏览器就会按对应格式渲染内容。

4. 能不能直接上传内存中的数据而不用存本地文件?

可以,使用put_object方法即可,比如你有一个字符串或者BytesIO格式的内存数据,直接调用s3_client.put_object(Bucket=BUCKET_NAME, Key=OBJECT_NAME, Body=你的内存数据)即可完成上传,适合动态生成内容的上传场景。

八、总结

整个S3对象上传流程可以归纳为4步:安装boto3依赖、准备对象存储访问凭证和桶资源、编写上传代码、运行验证,新手按步骤操作即可快速跑通。建议测试阶段优先选择国内兼容S3的对象存储服务降低接入门槛,比如七彩云对象存储,不需要处理海外服务的网络和认证问题;生产环境注意不要硬编码AK/SK,使用环境变量或配置中心存储敏感信息,大文件优先使用分片上传提升稳定性,敏感文件不要设置公开访问权限,通过预签名URL对外提供访问能力。

想进一步了解这个项目?

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

访问官网

相关文章

操作教程 / / 7 分钟阅读

外贸出海站视频存储下载分发怎么实现

一、结论 外贸出海站的视频存储、下载、分发可以通过对接具备全球边缘节点的对象存储+CDN加速服务实现,全程无需自行搭建存储、分发服务器,通过标准化配置即可实现跨地域低延迟访问、高可靠存储和灵活的下载权限管控。

操作教程 / / 6 分钟阅读

对象存储签名URL的作用详解与落地实践

核心作用结论 对象存储的签名URL是基于非对称加密算法生成的带授权信息的资源访问链接,核心作用可分为三类: 1. 临时授权访问私有资源:无需将存储桶设置为公开权限,也无需为终端用户分配长期访问密钥,即可让用户在指定时效内访问/操作指定的私有资源,适配付费内容、用户私有数据等敏感资源的分发场景。 2. 细粒度权限管控:支持针对单个对象设置不同的操作权限(读/写

操作教程 / / 7 分钟阅读

外贸出海业务S3接入时CORS跨域如何配置

一、结论 外贸出海业务接入S3时的CORS跨域配置,只需在对象存储控制台的对应Bucket设置中添加匹配业务需求的跨源规则,明确允许的请求源、请求方法、请求头和暴露头,保存后等待规则生效即可,全程无需修改前端业务核心代码。

操作教程 / / 7 分钟阅读

S3存储怎么给存储桶设置公共读权限

一、结论 给S3存储桶设置公共读权限,可通过控制台可视化配置、S3 API/SDK调用、命令行工具(如AWS CLI、s3cmd)三种主流方式实现,核心是修改存储桶的访问策略或ACL规则,放开匿名用户的读对象权限,配置完成后桶内符合条件的对象可被任意用户通过公网访问下载。

操作教程 / / 7 分钟阅读

怎么生成S3的预签名URL对外分享文件

一、结论 你无需将私有存储桶设置为公开权限,只需通过S3协议的预签名机制,即可生成带临时访问权限、带有效期的HTTP链接,外部用户拿到链接后在有效期内可直接访问、下载对应文件,无需分配独立账号权限,原生S3和所有兼容S3协议的对象存储服务均支持该能力。