使用Python Boto3生成的Cloudflare R2大文件预签名URL无法访问
Cloudflare R2 大文件(>1GB)预签名URL访问拒绝问题解决
问题原因
Cloudflare R2对超过1GB的存储对象,强制要求使用Range分段请求进行下载,而默认通过get_object生成的预签名URL未授权Range请求;若客户端使用AWS Signature Version 2签名,也会触发大文件访问被拒绝的问题。
解决步骤
- 强制使用AWS Signature Version 4创建R2客户端
初始化boto3客户端时显式指定签名版本,确保兼容R2大文件下载要求:
import boto3 from botocore.config import Config s3 = boto3.client( 's3', endpoint_url='https://<你的账号ID>.r2.cloudflarestorage.com', aws_access_key_id='<你的访问密钥>', aws_secret_access_key='<你的密钥密码>', config=Config(signature_version='s3v4') )
- 生成支持Range请求的预签名URL
修改预签名URL生成逻辑,构造允许分段请求的签名链接:
# 构造get_object请求并生成预签名URL request = s3.generate_presigned_request( 'get_object', Params={ 'Bucket': bucketName, 'Key': File_key, 'ResponseContentDisposition': 'attachment' }, ExpiresIn=3600*8 ) # 追加参数以支持任意Range请求 temp_link = request['url'] + '&x-amz-content-sha256=UNSIGNED-PAYLOAD'
验证说明
修改后,下载大文件时客户端会自动发起Range分段请求,R2将正常返回对应分段数据,不再触发访问拒绝错误。
内容的提问来源于stack exchange,提问作者itsmehemant7
相关产品推荐
相关产品推荐

