使用AWS Java SDK为现有S3对象设置Expires标头
我正在更新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
要更改现有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。 无论如何缓存控制也符合我们的要求。