如何使用 python boto3 更新 AWS S3 中现有对象的元数据?

新手上路,请多包涵

boto3 文档没有明确指定如何更新已存在的 S3 对象的用户元数据。

原文由 arc000 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 731
2 个回答

可以使用 copy_from() 方法来完成 -

 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')

原文由 arc000 发布,翻译遵循 CC BY-SA 3.0 许可协议

您可以使用 copy_from() 提到的资源( 如此答案)执行此操作,但您也可以使用客户端的 copy_object() 并指定相同的源和目标。这些方法是等效的,并在下面调用相同的代码。

 import boto3
s3 = boto3.client("s3")
src_key = "my-key"
src_bucket = "my-bucket"
s3.copy_object(Key=src_key, Bucket=src_bucket,
               CopySource={"Bucket": src_bucket, "Key": src_key},
               Metadata={"my_new_key": "my_new_val"},
               MetadataDirective="REPLACE")

“REPLACE”值指定请求中传递的元数据应 完全 覆盖源元数据。如果您只想 添加 新的键值,或仅删除 一些 键,则必须先读取原始数据,对其进行编辑并调用更新。

仅正确替换元数据的一个 _子集_:

  1. 使用 head_object(Key=src_key, Bucket=src_bucket) 检索原始元数据。还要注意响应中的 Etag
  2. 在本地对元数据进行所需的更改。
  3. 如上所述调用 copy_object 以上传新元数据,但在请求中传递 CopySourceIfMatch=original_etag 以确保远程对象在覆盖它之前具有您期望的元数据。 original_etag 是您在步骤 1 中得到的。如果元数据(或数据本身)自 head_object 被调用(例如,由同时运行的另一个程序)以来发生变化, copy_object 将因 HTTP 412 错误而失败。

参考: boto3 issue 389

原文由 init_js 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题