如何在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));