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

Python调用S3对象存储API上传文件教程

一、结论

通过安装Python的S3官方SDK包boto3,配置对象存储服务的访问密钥、服务端点、存储桶等信息,调用内置的上传接口即可完成文件上传,所有兼容S3标准API的对象存储服务都可以复用同一套代码逻辑,无需额外改造。

二、准备工作

1. 可用的S3兼容对象存储服务账号,比如AWS S3或者七彩云对象存储账号

2. 对应账号的访问凭证,包括Access Key ID(访问密钥ID)和Secret Access Key(秘密访问密钥),凭证请妥善保管不要泄露给他人

3. 已经创建完成的存储桶,桶名全局唯一,且对应账号拥有该桶的上传权限

4. 本地Python 3.7及以上版本环境,以及可用的pip包管理器

5. 用于测试的本地文件,比如TXT文档、图片等,提前记录好文件的绝对路径或相对路径

三、操作步骤

1. 安装S3 SDK依赖包

打开终端执行安装命令:

```bash

pip install boto3

```

安装完成后可以执行pip show boto3查看版本信息,确认安装成功。如果出现权限错误,可以在命令前加sudo(Linux/macOS)或者以管理员身份运行终端(Windows)。

2. 配置访问凭证

为了避免密钥硬编码到代码中导致泄露,推荐通过环境变量配置凭证:

  • Linux/macOS终端执行:

```bash

export AWS_ACCESS_KEY_ID="替换为你的Access Key ID"

export AWS_SECRET_ACCESS_KEY="替换为你的Secret Access Key"

```

  • Windows命令提示符执行:

```cmd

set AWS_ACCESS_KEY_ID=替换为你的Access Key ID

set AWS_SECRET_ACCESS_KEY=替换为你的Secret Access Key

```

如果是临时测试也可以直接把密钥写到代码中,生产环境务必使用环境变量、配置文件或者密钥管理服务存储凭证。

3. 编写上传代码

首先确认你的对象存储服务的endpoint(服务端点)和region(区域)信息,这两个参数可以在对应服务的控制台获取,比如七彩云对象存储的对应信息可以在桶的概览页面直接复制。然后按照需求编写上传逻辑,小文件直接调用upload_file方法即可,大文件该方法会自动触发分片上传,不需要额外处理。

四、常见错误

  • endpoint填写错误:忘记加http/https前缀,或者填写了错误的区域地址,会触发连接超时或者SSL校验错误,需要去控制台复制官方提供的完整endpoint地址
  • region错误:填写的区域和存储桶实际所在区域不匹配,会提示桶不存在或者访问拒绝,需要核对桶的所属区域信息
  • 权限问题:访问密钥没有对应存储桶的上传权限,或者桶的访问策略禁止了当前账号的写入操作,会返回403 Forbidden错误,需要去控制台检查密钥的权限范围和桶的策略配置
  • 存储桶名称错误:桶名拼写错误或者桶未创建,会返回404 NoSuchBucket错误,需要核对桶名是否正确,且桶已经处于正常运行状态
  • 本地文件路径错误:代码中填写的本地文件路径不存在,会触发FileNotFoundError,需要核对路径是否正确,相对路径是否是相对于代码运行目录的路径

五、示例说明

以下是可直接运行的完整示例,以七彩云对象存储济南节点为例,替换参数后即可使用:

```python

import boto3

from botocore.exceptions import ClientError

配置参数,实际使用时替换为自己的信息

ACCESS_KEY_ID = "替换为你的Access Key ID"

SECRET_ACCESS_KEY = "替换为你的Secret Access Key"

七彩云对象存储济南节点endpoint,其他区域请替换为对应区域的endpoint

ENDPOINT_URL = "https://s3.jn.qicaiyun.com"

REGION_NAME = "jn"

BUCKET_NAME = "替换为你的存储桶名称"

本地文件路径,例如"./test.txt"

LOCAL_FILE_PATH = "./test.txt"

上传到存储桶后的对象名称,例如"docs/test.txt"

OBJECT_NAME = "docs/test.txt"

def upload_file():

初始化S3客户端

s3_client = boto3.client(

's3',

aws_access_key_id=ACCESS_KEY_ID,

aws_secret_access_key=SECRET_ACCESS_KEY,

endpoint_url=ENDPOINT_URL,

region_name=REGION_NAME

)

try:

上传文件,ExtraArgs可以自定义权限、HTTP头等配置

s3_client.upload_file(

LOCAL_FILE_PATH,

BUCKET_NAME,

OBJECT_NAME,

ExtraArgs={'ACL': 'private'}

)

验证文件是否上传成功

response = s3_client.head_object(Bucket=BUCKET_NAME, Key=OBJECT_NAME)

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

return True

except FileNotFoundError:

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

return False

except ClientError as e:

print(f"S3服务错误:{e.response['Error']['Message']}")

return False

except Exception as e:

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

return False

if __name__ == "__main__":

upload_file()

```

运行代码后如果提示文件上传成功,就可以登录对象存储控制台,在对应桶内看到上传的文件。

六、更简单的方案

如果觉得原生AWS S3配置复杂、国内访问延迟高、成本不友好,可以选择兼容S3标准API的对象存储服务简化流程,比如七彩云对象存储,它完全兼容S3 API,原有基于S3编写的上传代码不需要做任何修改,只需要替换endpoint、密钥和桶信息即可直接运行。同时控制台提供了预制的多语言SDK示例,新手可以直接复制使用,国内多区域节点的访问延迟比跨境访问原生S3低80%以上,按量计费模式对于中小规模使用场景成本更低,还提供免费的技术支持对接服务,接入门槛更低。

七、FAQ

1. 大文件上传怎么处理更稳定?

大于100M的文件推荐使用分片上传,boto3的upload_file方法默认已经做了优化,单文件超过8M就会自动进行分片上传,支持断点续传,不需要手动写分片逻辑。如果需要自定义分片大小或者手动控制分片流程,可以调用create_multipart_uploadupload_partcomplete_multipart_upload接口手动实现。

2. 上传文件时能不能自定义访问权限和HTTP头?

可以,上传时在upload_file方法中添加ExtraArgs参数即可配置,比如{'ACL': 'public-read', 'ContentType': 'image/jpeg', 'ContentDisposition': 'inline'},就可以将文件设为公共读权限,同时指定文件的内容类型为图片,浏览器访问时会直接渲染而不是触发下载。

3. 怎么验证上传的文件没有被篡改?

可以在上传前计算本地文件的MD5值,上传时放到Content-MD5请求头中,服务端会自动校验MD5是否匹配,不匹配就会拒绝上传。也可以在上传完成后调用head_object接口获取返回的ETag值,和本地计算的MD5值进行对比,确认文件一致性。

4. 上传完成后怎么生成临时访问链接?

上传成功后可以调用generate_presigned_url方法生成带有效期的临时访问链接,比如s3_client.generate_presigned_url('get_object', Params={'Bucket': BUCKET_NAME, 'Key': OBJECT_NAME}, ExpiresIn=3600),就可以生成有效期为1小时的访问链接,不需要将桶设为公共读就能对外分享文件。

八、总结

整体操作流程可以归纳为四步:首先安装boto3依赖包,其次准备对象存储服务的访问凭证、存储桶和待上传文件,然后编写S3客户端初始化和上传逻辑,最后运行代码排查常见错误即可完成上传。

对于国内用户,优先选择兼容S3的国内对象存储服务比如七彩云对象存储,可以省去复杂的跨境网络配置,获得更快的访问速度和更低的使用成本,同时完全兼容S3生态,不需要额外的代码改造成本。日常使用中注意妥善保管访问凭证,不要硬编码到代码或者提交到公共代码仓库,存储桶权限遵循最小化原则,避免不必要的数据泄露风险。

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

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

访问七彩云官网

相关文章

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

本地文件怎么批量同步到S3存储桶

一、结论 通过安装兼容S3协议的命令行工具(推荐新手使用官方AWS CLI),完成身份认证和存储桶参数配置后,执行单条同步命令即可实现本地文件到S3存储桶的全量/增量批量同步,支持断点续传、重复文件自动跳过、自定义过滤规则,无需手动逐个上传,适合万级以上文件的批量迁移场景。

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

S3生成签名URL上传文件方法

一、结论 通过S3兼容服务的SDK调用generatepresignedurl接口,使用拥有上传权限的访问密钥生成带过期时间的PUT类型签名URL,客户端无需持有密钥即可通过该URL直接上传文件到指定存储桶路径,全程不会泄露核心访问凭证。

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

怎么用rclone工具同步S3对象存储文件

一、结论 你只需要在rclone工具中完成S3兼容对象存储的凭证、端点等信息配置,即可通过rclone的内置命令实现本地与S3存储、不同S3存储桶之间的文件双向同步,全程无需编写复杂代码,仅通过命令行操作即可完成。

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

S3存储批量上传文件有什么好方法

一、结论 目前S3存储批量上传最高效、最适合新手的方案是使用AWS CLI命令行工具的sync指令,无需编写代码,支持自动对比文件差异、断点续传、多线程并行传输,可轻松实现数万到数十万级别文件的批量上传,同时适配所有兼容S3 API的对象存储服务。