如何在Amazon S3中更改对象的元数据

nat*_*evw 35 python amazon-s3 boto

如果您已将对象上传到Amazon S3存储桶,那么如何使用API​​更改元数据?可以在AWS管理控制台中执行此操作,但不清楚如何以编程方式完成此操作.具体来说,我在Python中使用boto API并且从阅读源代码可以清楚地看出,使用key.set_metadata只能创建对象之前工作,因为它只会影响本地字典.

nat*_*evw 36

看来你需要用自己覆盖对象,x-amz-metadata-directive: REPLACE除了元数据之外还使用带有标题的"PUT对象(复制)" .在boto中,这可以这样做:

k = k.copy(k.bucket.name, k.name, {'myKey':'myValue'}, preserve_acl=True)
Run Code Online (Sandbox Code Playgroud)

请注意,将删除旧字典中未包含的任何元数据.因此,要保留旧属性,您需要执行以下操作:

k.metadata.update({'myKey':'myValue'})
k2 = k.copy(k.bucket.name, k.name, k.metadata, preserve_acl=True)
k2.metadata = k.metadata    # boto gives back an object without *any* metadata
k = k2;
Run Code Online (Sandbox Code Playgroud)

我几乎错过了这个解决方案,在一个错误标题的问题的介绍中暗示了这个问题实际上与这个问题不同的问题:改变内容 - 现有S3对象的处理

  • 我没有在第二个代码示例中看到旧元数据和新元数据之间的联合正在发生.当我执行代码时,对象的元数据会被最新的元数据覆盖. (2认同)

kar*_*tik 11

为了在S3文件上设置元数据,只是不提供目标位置,因为只有源信息足以设置元数据.

final ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata(metadataKey, value);
final CopyObjectRequest request = new CopyObjectRequest(bucketName, keyName, bucketName, keyName)
  .withSourceBucketName(bucketName)
  .withSourceKey(keyName)
  .withNewObjectMetadata(metadata);

s3.copyObject(request);`
Run Code Online (Sandbox Code Playgroud)

  • 问的问题是Python,但这是使用我能够在SO上找到的Java SDK的唯一答案.谢谢! (2认同)

edd*_*ddd 8

如果您希望远程使用您的元数据 set_remote_metadata

例: key.set_remote_metadata({'to_be': 'added'}, ['key', 'to', 'delete'], {True/False})

实施在这里:https: //github.com/boto/boto/blob/66b360449812d857b4ec6a9834a752825e1e7603/boto/s3/key.py#L1875


Joh*_*hir 5

您可以使用copy命令更改元数据,而无需重新加载对象.看到这个问题:是否可以在不下载整个对象的情况下更改S3对象上的标题?