使用 AWS Java 开发工具包为现有 S3 对象设置 Expires 标头
Posted
技术标签:
【中文标题】使用 AWS Java 开发工具包为现有 S3 对象设置 Expires 标头【英文标题】:Set Expires header for an existing S3 object using AWS Java SDK 【发布时间】:2012-04-05 12:55:15 【问题描述】:我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据。我想为每个对象设置 HTTP Expires
标头以更好地处理 HTTP/1.0 客户端。
我们使用AWS Java SDK,它允许在不重新上传对象内容的情况下更改对象的元数据。我们使用CopyObjectRequest 将对象复制到自身。 ObjectMetadata 类允许我们设置Cache-Control
、Content-Type
和其他几个标题。但不是Expires
标头。
我知道 S3 使用 REST API 存储和提供对象 PUT 的 Expires
标头。有没有办法通过 Java SDK 做到这一点?
更新表明我们正在使用 CopyObjectRequest
【问题讨论】:
【参考方案1】:要更改现有Amazon S3 对象的metadata,您需要将对象复制到自身并即时提供所需的新元数据,请参阅copyObject():
默认情况下,源对象的所有对象元数据都复制到 新的目标对象,除非在 提供了指定的 CopyObjectRequest。
这可以大致实现(我头顶的片段,所以要小心):
AmazonS3 s3 = new AmazonS3Client();
String bucketName = "bucketName ";
String key = "key.txt";
ObjectMetadata newObjectMetadata = new ObjectMetadata();
// ... whatever you desire, e.g.:
newObjectMetadata.setHeader("Expires", "Thu, 21 Mar 2042 08:16:32 GMT");
CopyObjectRequest copyObjectRequest = new CopyObjectRequest()
.WithSourceBucketName(bucketName)
.WithSourceKey(key)
.WithDestinationBucket(bucketName)
.WithDestinationKey(key)
.withNewObjectMetadata(newObjectMetadata);
s3.copyObject(copyObjectRequest);
请注意以下容易错过但很重要的copyObject()约束:
Amazon S3 访问控制列表 (ACL) 未复制到新的 目的。新对象将具有默认的 Amazon S3 ACL, CannedAccessControlList.Private,除非在 指定的 CopyObjectRequest。
这在我的代码片段中还没有考虑!
祝你好运!
【讨论】:
我应该更好地解释我们现在使用CopyObjectRequest
来执行此操作。我已更新问题以反映这一点。
ObjectMetadata.setHeader
被标记为仅供内部使用。你成功使用过这个吗?我们的代码只会运行一次,因此如果亚马逊进行更改,我们以后无需担心它。但是YMMV。
嗯,我确实不知道这个限制,但回想一下前一段时间使用过Expires:
;不过我可能是错的,因为我经常使用其他 SDK 与 S3 交互(例如 C#/Python,它们确实支持这一点)并且可能把它混在一起 - 代码本身与其他 setXYZHeader()
方法没有区别目前(请参阅ObjectMetadata.java),因此限制将基于不可见的副作用,如果有的话。
它可能被其他标头方法在内部和内部使用,因为只有某些标头才能工作。他们应该在ObjectMetadata
上添加一个setExpires
方法,因为它是唯一没有自己方法的标头。
@SteffenOpel Expires 值的“正确”日期是什么? 2042 年或 2014 年或 2024 年?从这个日期起取决于什么?这是将日期设置为 2042 年(或任何更远的日期)的理由吗?【参考方案2】:
我们一直在寻找类似的解决方案,最终选择了 max-age cache-control 指令。我们最终意识到 hte cache-control 会覆盖 Expires,即使 expires 更具限制性。无论如何,缓存控制也满足了我们的要求。
【讨论】:
谢谢。您是绝对正确的Cache-Control
取代了 Expires
标头。尽管如此,我们还是希望将它包含在不尊重Cache-Control
的 HTTP/1.0 客户端中。以上是关于使用 AWS Java 开发工具包为现有 S3 对象设置 Expires 标头的主要内容,如果未能解决你的问题,请参考以下文章
AWS S3 Java:doesObjectExist 导致 403:禁止
JBoss AS7 上的 AWS Java 开发工具包 - module.xml 条目
无法在 go 中使用 AWS 开发工具包获取 s3.Object ACL