【发布时间】:2017-07-16 06:09:42
【问题描述】:
这是一件奇怪的事情,我现在还无法理解。为什么当我使用 Boto3 将“过期”日期时间放在通过 put_object 放入 AWS S3 的对象上时,它会被存储并在 AWS cosnole 中显示为“元数据”。但是,当我检索对象时,我的“过期”日期时间显示为对象的日期时间元素,而不是元数据字典中的日期时间元素。
这个问题让我很困惑,但我在没有理解的情况下解决了这个问题。现在我想到了使用这种方法:How to update metadata of an existing object in AWS S3 using python boto3?,为了便于阅读,复制如下:
import boto3
s3 = boto3.resource('s3')
s3_object = s3.Object('bucket-name', 'key')
s3_object.metadata.update({'id':'value'})
s3_object.copy_from(
CopySource={'Bucket':'bucket-name', 'Key':'key'},
Metadata=s3_object.metadata, MetadataDirective='REPLACE')
导致我的“过期”元数据被销毁。当然我试过这个:
metakeys.metadata.update({'x-amz-meta-hell':'yes', 'expires': metakeys.expires})
但是会抛出:AttributeError: 'datetime.datetime' object has no attribute 'encode'
确实,您可以有效地更新元数据,而无需通过控制台破坏“过期”元素。所以在某种程度上我建议上面的方法要么是A:不可行或不正确,B:坏了,要么C:既坏又不正确
问题是 - 在不破坏 AWS S3 对象的这种或未来的奇怪行为的情况下更新对象元数据的正确方法是什么?
【问题讨论】:
标签: amazon-web-services amazon-s3 metadata boto3