Boto3 S3更新现有对象

时间:2017-02-25 10:54:05

标签: amazon-web-services amazon-s3 metadata boto3

这是一件奇怪的事情,我现在还无法解决这个问题。为什么当我使用Boto3来放置" expires"对于通过put_object放入AWS S3的对象的日期时间,它被存储并在AWS cosnole中显示为"元数据。"但是,当我检索对象时,我的"到期" datetime显示为对象的datetime元素,而不是Metadata字典中的datetime元素。

这个问题困惑了我,但我在不理解它的情况下解决了这个问题。现在我发现使用这种方法: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'对象没有属性'编码'

确实,您可以有效地更新元数据,而不会破坏" expires"元素通过控制台。所以在某种程度上我建议上面的方法是A:不可行或不正确,B:破碎,或C:破坏和不正确

问题是 - 在不破坏AWS S3对象的这种或未来奇怪行为的情况下更新对象元数据的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

如果你使用" expires"执行put_object()参数,你应该得到这样的东西。

{
    'Expiration': 'string',
    'ETag': 'string',
    ..........
}

但是,Expiration是一个属性,它不是您的用户自定义元数据。所有用户自定义元数据只能是STRING,并且在检查元数据时所有用户都会带有前缀x-amz-meta-

metakeys.metadata.update({'x-amz-meta-hell':'yes', 'expires': metakeys.expires})

如果给定的metakeys.expires不是字符串,则上述更新将失败。它可以像使用isoformat()将其转换为字符串一样简单。

尽管copy_object()允许您指定显式的到期日期时间,但是,API文档并没有明确提到原始文件到期日期时间将被复制到目标对象。