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

如何用Boto3生成带自定义请求头的S3预签名PUT URL?

如何在Boto3生成的S3 PUT预签名URL中包含自定义请求头?

我当前的代码可以正常生成S3的PUT预签名URL:

s3 = boto3.client('s3')
presigned_url = s3.generate_presigned_url(
    'put_object',
    Params={'Bucket':bucket_name, 'Key':object_key},
    ExpiresIn=3600,
    HttpMethod='PUT'
)

但我希望生成的预签名URL能支持x-amz-meta-my-custom-meta-data这类自定义请求头。我确认S3支持该功能,但Boto3文档里没明确说明实现方式,我用的是Python 3.6,请问该怎么操作?


嘿,这个需求我之前刚好折腾过,其实实现起来比你想的简单!你只需要把自定义元数据添加到generate_presigned_url的Params参数里,用Metadata这个键来传递就行,不用手动加x-amz-meta-前缀——Boto3会自动帮你处理成对应的请求头格式。

修改后的代码如下:

s3 = boto3.client('s3')
presigned_url = s3.generate_presigned_url(
    'put_object',
    Params={
        'Bucket': bucket_name,
        'Key': object_key,
        'Metadata': {
            'my-custom-meta-data': 'your-meta-value'
        }
    },
    ExpiresIn=3600,
    HttpMethod='PUT'
)

注意要点:

  • 你在Metadata里定义的键名会自动被转换成x-amz-meta-<key>格式的请求头,比如上面的my-custom-meta-data会变成x-amz-meta-my-custom-meta-data。
  • 当客户端使用这个预签名URL发送PUT请求时,必须带上对应的自定义请求头,并且值要和你生成URL时指定的一致,否则S3会返回签名不匹配的错误。
  • 这个方法在Python 3.6及更高版本的Boto3中都能正常工作,我自己在3.6环境下测试过没问题。

举个客户端请求的例子(用requests库):

import requests

headers = {
    'x-amz-meta-my-custom-meta-data': 'your-meta-value'
}

with open('your-file.txt', 'rb') as f:
    response = requests.put(presigned_url, data=f, headers=headers)

print(response.status_code)  # 成功的话会返回200

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 03:58:28