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

bki*_*bri 6 java amazon-s3 amazon-web-services http-headers

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

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

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

更新以表明我们正在使用 CopyObjectRequest

Ste*_*pel 6

要更改现有Amazon S3对象的元数据,您需要将对象复制到自身并动态提供所需的新元数据,请参阅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);
Run Code Online (Sandbox Code Playgroud)

请注意以下容易遗漏,但重要的copyObject()约束:

Amazon S3 Acccess控制列表(ACL)不会复制到新对象.除非在指定的CopyObjectRequest中显式提供了一个,否则新对象将具有默认的Amazon S3 ACL CannedAccessControlList.Private.

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

祝好运!