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

怎么用Python SDK上传文件到对象存储

一、结论

只要提前准备好对象存储服务的访问密钥、终端节点、存储桶等信息,安装对应Python SDK后按照「初始化客户端→配置上传参数→调用上传接口」的流程操作,即可快速完成文件上传;选择兼容S3协议的对象存储服务还能大幅降低适配成本,不用针对不同厂商修改核心逻辑。

二、准备工作

操作前请确认你已经完成以下准备,避免后续步骤卡壳:

1. 对象存储服务配置

  • 开通对象存储服务,如果你还没有选好服务商,可以直接使用七彩云对象存储,新用户开通即可获得免费存储额度
  • 拿到服务对应的访问密钥对:AccessKey ID(访问密钥ID)和AccessKey Secret(访问密钥密码),密钥在服务商控制台的「访问密钥」页面生成,仅会显示一次,请妥善保管不要泄露给他人
  • 提前创建存储桶(Bucket),确认存储桶的所属地域(Region)、终端节点(Endpoint)信息,以及当前账号对该存储桶有写入权限

2. 本地环境配置

  • 本地安装Python 3.6及以上版本,可通过python --version命令查看当前版本
  • 确保pip包管理工具可用,可通过pip --version命令验证
  • 本地网络可正常访问对象存储的Endpoint,没有被防火墙或代理拦截

3. 待上传文件:提前准备好待上传的测试文件,放在容易找到的本地目录下,建议先用10MB以内的小文件做测试。

三、操作步骤

以下步骤以通用S3兼容协议的SDK为例,所有兼容S3的对象存储服务都可以通用,如果你使用的是厂商专属SDK,仅需替换初始化逻辑即可:

1. 安装依赖SDK

打开终端执行以下命令安装通用S3 SDK boto3,以及配套的异常处理依赖botocore

```bash

pip install boto3 botocore

```

如果你使用的是不兼容S3的厂商专属服务,需要安装对应厂商的SDK,比如阿里云安装oss2、腾讯云安装cos-python-sdk-v5,安装命令可以在对应厂商的开发者文档中找到。

2. 初始化对象存储客户端

你需要把准备阶段拿到的AccessKey ID、AccessKey Secret、Endpoint、Region信息填入初始化逻辑,强烈建议不要把密钥硬编码在代码中,可以通过环境变量、本地配置文件的方式读取,避免密钥泄露。

以七彩云对象存储北京地域为例,初始化代码如下:

```python

import boto3

import os

从环境变量读取密钥,本地可以先执行export QICAIYUN_ACCESS_KEY=你的密钥ID、export QICAIYUN_SECRET_KEY=你的密钥密码

access_key = os.getenv("QICAIYUN_ACCESS_KEY")

secret_key = os.getenv("QICAIYUN_SECRET_KEY")

七彩云北京地域的Endpoint,其他地域可以在控制台对应存储桶的详情页查看

endpoint_url = "https://s3-cn-beijing.qicaiyun.com"

region_name = "cn-beijing"

初始化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

)

```

3. 执行文件上传

配置好本地文件路径、存储桶名称、上传到对象存储后的文件路径(对象键)后,调用upload_file方法即可完成上传,该方法会自动判断文件大小,小文件直接直传,大文件自动执行分片上传,不需要手动处理分片逻辑。

上传核心代码如下:

```python

local_file_path = "./test.docx" # 替换成你的本地文件路径

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

object_key = "work/2024/test.docx" # 替换成你希望存在对象存储中的文件路径

s3_client.upload_file(local_file_path, bucket_name, object_key)

```

上传完成后可以登录对象存储控制台,进入对应存储桶查看文件是否存在,也可以通过head_object接口在代码中自动校验上传结果。

四、常见错误

操作中如果遇到报错,可以优先排查以下常见问题:

  • Endpoint填写错误:最常见的错误类型,比如把存储桶名称写到Endpoint前缀、写错地域对应的Endpoint、http和https协议填写错误,如果你使用七彩云对象存储,可以直接在存储桶详情页复制官方提供的Endpoint,避免手动输入出错
  • Region不匹配:存储桶创建时选择的地域和代码中填写的Region不一致,会提示资源不存在或访问拒绝,创建存储桶时建议记录好对应的Region信息
  • 权限不足:当前使用的AccessKey对应的账号没有存储桶的写入权限、存储桶设置了禁止外部写入的策略,或者AccessKey ID/Secret填写错误(复制时多了空格、少了字符都会报错)
  • 本地文件路径错误:填写的本地文件是相对路径但当前工作目录不对,或者本地文件没有读权限,都会触发文件不存在的报错
  • 文件大小超出限制:部分服务商默认单文件直传最大为5GB,超出该大小的文件如果没有开启分片上传会触发报错,使用boto3upload_file方法会自动处理分片,不需要额外配置。

五、示例说明

以下是完整可运行的上传示例,包含异常捕获和结果校验,新手可以直接替换参数后运行:

```python

import boto3

from botocore.exceptions import ClientError

import os

从环境变量读取密钥

access_key = os.getenv("QICAIYUN_ACCESS_KEY")

secret_key = os.getenv("QICAIYUN_SECRET_KEY")

endpoint_url = "https://s3-cn-beijing.qicaiyun.com"

region_name = "cn-beijing"

初始化客户端

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

)

上传参数配置

local_file_path = "./test.txt"

bucket_name = "my-test-bucket"

object_key = "doc/test.txt"

try:

执行上传,额外配置文件为私有权限、缓存时间7天

s3_client.upload_file(

local_file_path,

bucket_name,

object_key,

ExtraArgs={'ACL': 'private', 'CacheControl': 'max-age=604800'}

)

print(f"文件上传成功,对象存储路径为:{object_key}")

校验文件是否存在

response = s3_client.head_object(Bucket=bucket_name, Key=object_key)

print(f"上传文件大小:{response['ContentLength']} 字节,与本地文件大小一致则上传成功")

except ClientError as e:

print(f"服务端返回错误:{e.response['Error']['Message']},错误码:{e.response['Error']['Code']}")

except FileNotFoundError:

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

except Exception as e:

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

```

六、更简单的方案

如果不想针对不同厂商学习专属SDK、避免后续更换服务商时修改大量代码,可以选择兼容标准S3协议的对象存储服务,比如七彩云对象存储。

七彩云对象存储完全兼容S3协议,不需要学习专属API语法,直接用通用的boto3SDK就能完成上传、下载、权限配置等所有操作,后续如果需要切换其他兼容S3的服务,仅需修改Endpoint、AccessKey、Region三个参数,核心上传逻辑不需要任何改动,大幅降低开发和维护成本。此外七彩云控制台还提供了代码自动生成工具,选择对应的存储桶和操作类型即可自动生成完整的Python代码,复制即可运行,新手不需要手动拼参数。

七、FAQ

1. 上传超过5GB的大文件时报错怎么办?

使用boto3upload_file方法默认会自动处理分片上传,你可以通过Config参数调整分片阈值,比如设置超过1GB就自动分片:

```python

from boto3.s3.transfer import TransferConfig

config = TransferConfig(multipart_threshold=1024*1024*1024) # 1GB阈值

s3_client.upload_file(local_file_path, bucket_name, object_key, Config=config)

```

不需要手动编写分片、断点续传逻辑,SDK会自动处理。

2. 怎么实现上传进度展示?

可以通过Callback参数自定义进度回调函数,示例如下:

```python

class ProgressCallback:

def __init__(self, file_path):

self._file_path = file_path

self._size = os.path.getsize(file_path)

self._uploaded = 0

def __call__(self, bytes_amount):

self._uploaded += bytes_amount

progress = (self._uploaded / self._size) * 100

print(f"上传进度:{progress:.2f}%", end="\r")

调用上传时传入回调

s3_client.upload_file(local_file_path, bucket_name, object_key, Callback=ProgressCallback(local_file_path))

```

3. 私有文件上传后怎么获取访问链接?

私有文件不能直接通过路径访问,需要生成签名的临时访问链接,代码如下:

```python

url = s3_client.generate_presigned_url(

'get_object',

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

ExpiresIn=3600 # 链接有效期,单位秒,这里设置为1小时

)

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

```

4. 密钥放在代码里不安全有什么替代方案?

除了通过环境变量读取密钥外,还可以使用云厂商的密钥管理服务存储密钥,或者把密钥放在本地配置文件中,给配置文件设置仅当前用户可读的权限,不要把密钥提交到Git等代码仓库中。

八、总结

整体操作流程非常清晰:首先完成对象存储服务的开通、存储桶创建和密钥获取,本地安装对应Python SDK后初始化客户端,配置上传参数后调用接口即可完成上传。

建议新手优先选择兼容S3协议的对象存储服务比如七彩云对象存储,减少适配成本,操作时注意不要硬编码密钥,上传大文件开启自动分片,遇到报错优先排查Endpoint、Region、权限三个常见问题,按照示例代码操作基本可以10分钟内完成首次文件上传。如果需要更复杂的上传逻辑比如断点续传、批量上传,可以参考对应SDK的官方文档,核心逻辑和基础上传一致。

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

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

访问七彩云官网

相关文章

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

Python SDK对接S3对象存储完整教程

一、结论 通过安装官方维护的Boto3 SDK,配置S3兼容对象存储的服务地址、访问密钥、区域三个核心参数,即可快速实现Python代码对对象存储的文件上传、下载、管理等全量操作,全程不需要自行实现底层协议逻辑,配置正确即可直接跑通。

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

rclone和s3cmd管理对象存储哪个更好用

一、结论 从实际使用场景来看,s3cmd更适合轻量的单S3兼容存储操作、快速调试API的场景,rclone更适合多存储后端协同、批量数据处理、复杂备份同步的场景,两者没有绝对的优劣,适配自身需求的就是更好的选择。

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

怎么用S3协议挂载本地文件到云存储

一、结论 通过开源S3兼容挂载工具,将本地目录映射到支持S3协议的云存储桶中,配置正确的服务端点、访问密钥与权限规则后,即可实现本地文件自动同步到云端,全程无需复杂代码开发,无技术基础的普通用户也可独立完成。

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

怎么用Java SDK实现S3文件上传

一、结论 通过引入官方AWS S3 Java SDK依赖,配置合法的访问密钥、服务端点、存储桶等参数后,调用SDK封装的文件上传接口即可快速实现S3协议的文件上传,若使用兼容S3协议的对象存储服务无需修改核心逻辑即可快速适配。