我需要更新所有AmazonS3云文件中该高速缓存控制头。但是,我不知道如何使用jclouds API来实现这一点。我使用的是Apache Jclouds插件。我得到了两个相关的答案:
- jclouds : how do I update metadata for an existing blob?
- Set Expires header for an existing S3 object using AWS Java SDK
第一个答案是建议使用SwiftKey API类,这在grails的jcloud插件中不可用。第二个答案是使用AWS java sdk,已经有一个grails Package 插件https://grails.org/plugin/aws-sdk,但它不支持元数据更新。
8条答案
按热度按时间mcdcgff01#
可以通过执行对象复制来更改元数据(参见How to update metadata using Amazon S3 SDK):
这是否是一个哲学上的“更新”是由你来决定。
lhcgjxsq2#
您不能:
每个Amazon S3对象都有数据、密钥和元数据。对象键(或键名)唯一标识存储桶中的对象。对象元数据是一组名称-值对。您可以在上载对象元数据时对其进行设置。上传对象后,无法修改对象元数据。修改对象元数据的唯一方法是创建对象的副本并设置元数据。
http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
vhmi4jdf3#
PHP示例
我知道这个问题不是PHP特定的,但它可能会帮助某人,因为它是谷歌的顶级结果。
此操作将覆盖现有对象。
roejwanj4#
如其他答复所述,可以提出“复制”请求,以覆盖现有记录。
Ruby示例
uurv41yg5#
我最近不得不这样做,并使用JS:
izj3ouym6#
在我的例子中,我关心对象的版本,复制会创建一个新版本。我决定用可变元数据创建一个并行的“隐藏”对象。例如,如果我有
/foo/bar/baz
,那么我将创建/foo/bar/.baz
。oo7oh9g97#
我在任何地方都找不到它的文档,但是如果你使用Step Functions to make an SDK call to S3,你可以像上面的PHP和Ruby一样使用
MetadataDirective
来设置元数据(这个例子显示了s3:copyObject的参数):xmd2e60i8#
截至2018年3月,AWS SDK的最新版本。NET Core已更改。它现在使用异步编程。许多方法签名已更改。虽然如果没有Dan建议的对象复制解决方案,您仍然无法更改元数据,但是执行此操作的代码已经实现了。
我的解决方案是用修改后的元数据更新现有的S3对象。
下面的代码适用于更新单个元数据值(基于键和新值)。我有两个循环用于设置元数据,但可以优化为只有一个: