35

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

4

7 回答 7

36

x-amz-metadata-directive: REPLACE除了元数据之外,您似乎需要使用带有标题的“PUT Object(Copy)”来覆盖对象本身。在 boto 中,可以这样完成:

k = k.copy(k.bucket.name, k.name, {'myKey':'myValue'}, preserve_acl=True)

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

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;

我几乎错过了这个解决方案,在一个标题错误的问题的介绍中暗示了这个问题,这个问题实际上与这个问题不同:Change Content-Disposition of existing S3 object

于 2011-01-21T01:07:21.637 回答
12

为了在 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);`
于 2013-05-14T10:37:52.390 回答
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

于 2015-04-14T10:35:08.547 回答
5

您可以使用复制命令更改元数据而无需重新加载对象。请参阅此问题:是否可以在不下载整个对象的情况下更改 S3 对象上的标头?

于 2012-02-18T02:18:13.020 回答
1

对于第一个答案,最好在元数据中包含原始内容类型,例如:

key.set_metadata('Content-Type', key.content_type) 
于 2013-05-17T21:23:04.413 回答
-1

在 Java 中,您可以将对象复制到同一位置。这里元数据不会在复制对象时复制。您必须获取原始元数据并设置为复制请求。更推荐使用此方法插入或更新 Amazon S3 对象的元数据

ObjectMetadata metadata = amazonS3Client.getObjectMetadata(bucketName, fileKey);
ObjectMetadata metadataCopy = new ObjectMetadata();
metadataCopy.addUserMetadata("yourKey", "updateValue");
metadataCopy.addUserMetadata("otherKey", "newValue");
metadataCopy.addUserMetadata("existingKey", metadata.getUserMetaDataOf("existingValue"));

CopyObjectRequest request = new CopyObjectRequest(bucketName, fileKey, bucketName, fileKey)
      .withSourceBucketName(bucketName)
      .withSourceKey(fileKey)
      .withNewObjectMetadata(metadataCopy);

amazonS3Client.copyObject(request);
于 2015-04-23T05:23:20.753 回答
-1

这是对我有用的代码。我正在使用 aws-java-sdk-s3 版本 1.10.15

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(fileExtension.getMediaType());

s3Client.putObject(new PutObjectRequest(bucketName, keyName, tempFile)
                    .withMetadata(metadata));
于 2015-09-04T05:35:54.047 回答