如何用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
相关产品推荐
相关产品推荐

