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

时间:2011-01-21 00:56:58

标签: python amazon-s3 boto

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

7 个答案:

答案 0 :(得分:36)

除了元数据之外,您似乎需要使用带有x-amz-metadata-directive: REPLACE标头的“PUT对象(复制)”来自行覆盖对象。在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

答案 1 :(得分: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);`

答案 2 :(得分:7)

如果您希望远程存储元数据,请使用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

答案 3 :(得分:5)

您可以使用copy命令更改元数据,而无需重新上传对象。请参阅此问题:Is it possible to change headers on an S3 object without downloading the entire object?

答案 4 :(得分:1)

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

key.set_metadata('Content-Type', key.content_type) 

答案 5 :(得分:-1)

In Java, You can copy object to the same location. Here metadata will not copy while copying an Object. You have to get metadata of original and set to copy request. This method is more recommended to insert or update metadata of an Amazon S3 object

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

答案 6 :(得分:-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));