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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 20:45:03