我使用Amazon的AWS SDK的PHP版本。 我有一堆与文件的Expires
头; 我想删除这个头,并添加一个Cache-control
头代替。 该update_object功能让我添加页眉但不删除它们。
在对这个问题的回答表明,当你复制它,你可以更新文件的元数据,但我已经尝试过了,这是行不通的。 下面是我用什么:
$response = $s3->copy_object(
array(
'bucket' => $bucket,
'filename' => $file,
),
array(
'bucket' => $bucket,
'filename' => $file2,
),
array(
'acl' => AmazonS3::ACL_PUBLIC,
'headers' => array(
'Content-Type' => 'image/jpeg',
'Cache-Control' => 'public,max-age=30240000',
),
'meta' => array(
'x-fake-header' => 'something awesome is happening',
),
)
);
然而,复制的对象具有完全相同的头部与原始对象(Expires和仅内容类型)。 我已经试过以上(有和没有的内容类型,缓存控制,元等)的组合,所有的方式,并得到同样的结果。
如何重置元数据?
我刚刚发现,复制到反对本身其实不正确更改页眉。 我将其复制到第二个文件用于测试目的,以避免覆盖原来的。
但是,对于一些奇怪的原因复制到不同的文件不会更改标题,但复制到同一个文件一样。
在Java中,您可以对象复制到同一位置。 这里同时复制对象元数据将不会复制。 你必须得到的原始元数据和设置复制请求。 建议此方法更插入或一个Amazon S3对象的更新元数据
ObjectMetadata metadata = amazonS3Client.getObjectMetadata(bucketName, fileKey);
ObjectMetadata metadataCopy = new ObjectMetadata();
metadataCopy.addUserMetadata("yourKey", "updateValue");
metadataCopy.addUserMetadata("otherKey", "newValue");
metadataCopy.addUserMetadata("existingKey", metadata.getUserMetaDataOf("existingValue"));
CopyObjectRequest request = new CopyObjectRequest(bucketName, fileKey, bucketName, fileKey)
.withSourceBucketName(bucketName)
.withSourceKey(fileKey)
.withNewObjectMetadata(metadataCopy);
amazonS3Client.copyObject(request);
基于Jeffin PS的回答(这伟大工程),我提议通过克隆原来的创建新的元数据对象的版本。 这样,AWS特有的(非用户)元数据没有得到转化为用户的元数据。 不知道这将是一个真正的问题,但似乎更合法的这种方式。
ObjectMetadata metadataCopy = amazonS3Client.getObjectMetadata(bucketName, fileKey).clone();
metadataCopy.addUserMetadata("yourKey", "updateValue");
metadataCopy.addUserMetadata("otherKey", "newValue");
CopyObjectRequest request = new CopyObjectRequest(bucketName, fileKey, bucketName, fileKey)
.withSourceBucketName(bucketName)
.withSourceKey(fileKey)
.withNewObjectMetadata(metadataCopy);
amazonS3Client.copyObject(request);