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

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

看起来你需要用自己覆盖对象,除了元数据之外,使用带有x-amz-metadata-directive: REPLACE头的“PUT Object(Copy)”。 在博托,这可以这样做:

 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; 

我几乎错过了这个解决scheme,这是暗示在一个不正确的标题的问题,其实是关于一个不同的问题,而不是这个问题: 改变内容 – 现有的S3对象的configuration

为了在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

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

对于第一个答案,在元数据中包含原始内容types是一个好主意,例如:

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