如何更改Amazon S3中对象的元数据
如果你已经把一个文件上传到了亚马逊的S3存储桶里,想要通过API来修改这个文件的元数据(也就是一些关于文件的信息),该怎么做呢?在AWS的管理控制台里是可以做到的,但通过编程的方式怎么操作就不太清楚了。具体来说,我在用Python的boto API,阅读源码后发现,使用key.set_metadata这个方法只能在文件创建之前使用,因为它只是影响了一个本地的字典,并没有真正修改已经存在的文件。
7 个回答
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
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);`
37
看起来你需要用对象本身来覆盖自己,也就是使用“PUT对象(复制)”这个操作,同时在请求中加上一个叫做 x-amz-metadata-directive: REPLACE
的头部信息,除了元数据之外。用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;
我差点错过了这个解决方案,它在一个标题不太准确的问题的开头提到过,那个问题其实是关于其他问题的: 更改现有S3对象的Content-Disposition