使用AWS Java SDK为现有S3对象设置Expires标头

我正在更新Amazon S3存储桶中的现有对象以设置一些元数据。 我想为每个对象设置HTTP Expires标头以更好地处理HTTP / 1.0客户端。

我们正在使用AWS Java SDK ,它允许对对象进行元数据更改,而无需重新上传对象内容。 我们使用CopyObjectRequest将对象复制到自身。 ObjectMetadata类允许我们设置Cache-ControlContent-Type和其他几个标头。 但不是Expires标题。

我知道S3使用REST API存储并为对象PUT提供Expires头。 有没有办法从Java SDK中执行此操作?

更新以指示我们正在使用 CopyObjectRequest

要更改现有Amazon S3对象的元数据 ,您需要将对象复制到自身并动态提供所需的新元数据,请参阅copyObject() :

默认情况下,除非提供指定CopyObjectRequest中的新对象元数据,否则源对象的所有对象元数据都将复制到新目标对象。

这可以像大约一样实现(从头顶开始的片段,所以要小心):

 AmazonS3 s3 = new AmazonS3Client(); String bucketName = "bucketName "; String key = "key.txt"; ObjectMetadata newObjectMetadata = new ObjectMetadata(); // ... whatever you desire, eg: 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 Acccess控制列表(ACL) 不会复制到新对象。 除非在指定的CopyObjectRequest中显式提供了一个,否则新对象将具有默认的Amazon S3 ACL CannedAccessControlList.Private。

我的代码片段中没有考虑到这一点!

祝你好运!

我们正在寻找类似的解决方案,并最终确定了max-age缓存控制指令。 我们最终意识到,即使expires更具限制性,hte cache-control也会覆盖Expires。 无论如何缓存控制也符合我们的要求。