我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据。我想为每个对象设置 HTTP Expires
header ,以便更好地处理 HTTP/1.0 客户端。
我们正在使用 AWS Java SDK ,它允许在不重新上传对象内容的情况下更改对象的元数据。我们使用 CopyObjectRequest 来做到这一点将对象复制到自身。 ObjectMetadata类允许我们设置 Cache-Control
、Content-Type
和其他几个 header 。但不是 Expires
header 。
我知道 S3 使用 REST API 为 PUT 对象存储和提供 Expires
header 。有没有办法从 Java SDK 执行此操作?
已更新以表明我们正在使用 CopyObjectRequest
最佳答案
要更改 metadata现有 Amazon S3对象,您需要将对象复制到自身并即时提供所需的新元数据,请参阅 copyObject() :
By default, all object metadata for the source object are copied to the new destination object, unless new object metadata in the specified CopyObjectRequest is provided.
这可以大致实现(我脑子里的片段,所以要小心):
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()约束:
The Amazon S3 Acccess Control List (ACL) is not copied to the new object. The new object will have the default Amazon S3 ACL, CannedAccessControlList.Private, unless one is explicitly provided in the specified CopyObjectRequest.
这在我的代码片段中没有说明!
祝你好运!
关于java - 使用 AWS Java SDK 为现有 S3 对象设置过期 header ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9797276/