使用Python Boto-2.48调用get_metadata无法获取AWS S3对象元数据
Boto 2.48 + Python 2.7: S3 get_metadata() Returns None for Object Metadata
我明白你遇到的困扰——调用get_metadata()始终返回None,拿不到S3对象的标准元数据,这在Boto 2.x里其实是个容易踩的误区,咱们一步步来解决:
问题根源
在Boto 2.x版本中,get_metadata()方法仅用于获取自定义元数据(也就是那些以x-amz-meta-为前缀的用户自定义键值对)。而你尝试获取的Cache-Control、Content-Type、Expires属于S3的标准HTTP元数据,Boto为这类字段提供了专门的属性,不需要通过get_metadata()调用。
解决方案:直接访问标准元数据属性
修改你的代码,使用Boto2内置的对应属性来获取这些标准元数据:
for key in bucket: key = bucket.get_key(key.name) print key if key is not None: # 调用Boto2提供的标准元数据属性 print key.name, key.cache_control, key.content_type, key.expires
额外验证步骤
如果修改后依然拿不到值,先确认对象本身确实配置了这些元数据:
- 登录AWS控制台,找到目标存储桶和对象,查看其元数据配置
- 或者用AWS CLI命令直接查询:
aws s3api head-object --bucket your-bucket-name --key images/xyz.jpg
这个命令会返回对象的完整元数据,如果输出里没有CacheControl、ContentType或Expires字段,说明对象本身就没设置这些元数据,需要先为对象配置对应属性。
自定义元数据的正确获取方式
如果之后需要获取自定义元数据(比如你自己添加的x-amz-meta-author),才需要用get_metadata(),并且不需要带前缀,直接使用键名即可:
# 获取自定义元数据x-amz-meta-author author = key.get_metadata('author')
内容的提问来源于stack exchange,提问作者Nirmal Pathak
相关产品推荐
相关产品推荐

