You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python的boto3上传文件到Cloudflare R2并获取公网访问URL?

使用Python boto3上传文件到Cloudflare R2并获取公网访问URL

可以实现,以下是两种常见解决方法:

1. 手动拼接公开访问URL(适用于公开可读的对象)

Cloudflare R2的公开对象URL格式是固定的,无需从上传响应中提取,直接按规则拼接即可:

  • 默认R2域名格式:https://<你的Cloudflare账户ID>.r2.cloudflarestorage.com/<桶名>/<对象键>
  • 自定义域名格式:如果你给R2桶绑定了自定义域名,URL为https://<你的自定义域名>/<对象键>

代码示例:

# 替换为你的实际信息
account_id = "your-cloudflare-account-id"
bucket_name = "my_bucket"
object_key = "foo.png"

# 生成默认R2公网URL
public_url = f"https://{account_id}.r2.cloudflarestorage.com/{bucket_name}/{object_key}"

# 若使用自定义域名,替换为下面的代码
# public_url = f"https://your-custom-domain.com/{object_key}"

注意:

要让对象能通过公开URL访问,你需要确保:

  • 在R2控制台给桶配置了公共访问策略,或者
  • 上传时给对象设置public-read的ACL,修改上传代码如下:
res = bucket.Object("foo.png").put(Body=f.read(), ACL='public-read')

2. 生成预签名URL(适用于私有对象)

如果对象是私有(未开启公开访问),可以用boto3的generate_presigned_url生成带有效期的临时访问URL,R2完全兼容S3的预签名机制:

代码示例:

# 改用boto3 client(比resource更适合生成预签名URL)
import boto3

s3_client = boto3.client(
    "s3",
    endpoint_url=endpoint_url,
    aws_access_key_id=aws_access_key_id,
    aws_secret_access_key=secret_access_key,
)

bucket_name = "my_bucket"
object_key = "foo.png"

# 生成有效期为3600秒(1小时)的预签名URL
presigned_url = s3_client.generate_presigned_url(
    'get_object',
    Params={'Bucket': bucket_name, 'Key': object_key},
    ExpiresIn=3600
)

为什么上传响应中没有URL?

Cloudflare R2的S3兼容API在put操作的响应里,不会直接返回对象的公网URL(这和原生S3或部分其他存储服务不同),因此需要通过上述两种方式自行生成。


内容的提问来源于stack exchange,提问作者gameveloster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:45:20