使用boto3从S3预签名URL获取数据的参数配置与报错解决
S3预签名URL生成问题解决方案
1. 明确Params中Key参数的取值
S3的Key参数是目标对象在存储桶内的完整相对路径,不需要包含桶名。从你给出的预签名URL示例可以直接提取:
# 示例预签名URL结构 https://[桶名].s3.amazonaws.com/[Key值]?[查询参数]
对应你的示例,Key的取值就是 folder1/annotations/sub-folder1/9162dn28sd78n.json
2. 补充自定义返回参数
你观察到的response-content-disposition、response-content-type参数需要直接放到Params字典中,才会生成到最终的预签名URL里:
response-content-disposition:控制访问URL时的下载行为,可配置为附件下载、指定下载文件名response-content-type:指定返回的资源MIME类型
你给出的示例URL里的respone-content-disposition属于拼写错误,实际生成时SDK会自动输出正确的参数名,无需手动修正。
3. 修正ExpiresIn参数错误
你当前代码中ExpiresIn填的是Unix时间戳1661271906,这个参数的实际要求是预签名URL的有效时长,单位为秒,最长不能超过7天(即604800秒),超出范围会生成无效签名。
4. 解决InvalidRequest报错
你遇到的The authorization mechanism you have provided is not supported报错常见原因有3个:
- 填写的
region_name和桶实际所在区域不匹配,可在S3控制台桶的属性页查看实际区域 - 使用的AK/SK没有对应S3桶的
s3:GetObject权限 - 特殊区域(如AWS中国区)需要额外指定endpoint_url,比如中国宁夏区为
https://s3.cn-northwest-1.amazonaws.com.cn
5. 修正后的完整代码示例
import boto3 client = boto3.client( 's3', aws_access_key_id = '替换为你的实际aws_access_key_id', aws_secret_access_key = '替换为你的实际aws_secret_access_key', region_name = '替换为桶实际所在区域', # AWS中国区需要额外加下面这行,海外区无需配置 # endpoint_url = 'https://s3.cn-northwest-1.amazonaws.com.cn' ) url = client.generate_presigned_url( 'get_object', Params={ 'Bucket':'video_annotations', 'Key':'folder1/annotations/sub-folder1/9162dn28sd78n.json', 'ResponseContentDisposition': 'attachment; filename="812jad9.json"', 'ResponseContentType': 'application/json' }, # 配置有效期为1天,可根据需求调整,最长不超过7天 ExpiresIn=86400 ) print(url)
额外说明
预签名URL中的AWSAccessKeyId、Expires、Signature均为boto3自动计算生成,不需要手动配置,只要你填写的AK/SK、区域、桶名、Key正确,就会生成合法的签名参数。
内容的提问来源于stack exchange,提问作者SL42
相关产品推荐
相关产品推荐

