如果您已将对象上传到 Amazon S3 存储桶,如何使用 API 更改元数据?可以在 AWS 管理控制台中执行此操作,但不清楚如何以编程方式完成。具体来说,我在 Python 中使用 boto API,并且从阅读源代码中可以清楚地看出,使用 key.set_metadata 仅在创建对象之前有效,因为它只会影响本地字典。
7 回答
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
为了在 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);`
如果您希望远程存储元数据,请使用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
您可以使用复制命令更改元数据而无需重新加载对象。请参阅此问题:是否可以在不下载整个对象的情况下更改 S3 对象上的标头?
对于第一个答案,最好在元数据中包含原始内容类型,例如:
key.set_metadata('Content-Type', key.content_type)
在 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);
这是对我有用的代码。我正在使用 aws-java-sdk-s3 版本 1.10.15
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(fileExtension.getMediaType());
s3Client.putObject(new PutObjectRequest(bucketName, keyName, tempFile)
.withMetadata(metadata));