如何使用Amazon S3 SDK更新元数据

时间:2012-08-07 13:33:52

标签: php amazon-s3 amazon-web-services http-headers

我正在使用亚马逊AWS SDK的PHP版本。我有一堆带有Expires标题的文件;我想删除该标头并添加Cache-control标头。 update_object功能允许我添加标题但不删除标题。

answers on this question建议你可以在复制时更新文件的元数据,但我已经尝试了它并且它不起作用。这是我使用的:

$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和Content-Type)。我已经尝试了上述各种组合(有和没有Content-Type,Cache-control,meta等)并获得相同的结果。

如何重置元数据?

3 个答案:

答案 0 :(得分:3)

我刚刚发现复制到对象实际上 正确地更改了标题。我正在将其复制到第二个文件以进行测试,以避免覆盖原始文件。

但是由于某些奇怪的原因,复制到不同的文件不会更改标题,但复制到同一个文件会有效。

答案 1 :(得分:1)

In Java, You can copy object to the same location. Here metadata will not copy while copying an Object. You have to get metadata of original and set to copy request. This method is more recommended to insert or update metadata of an Amazon S3 object

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);

答案 2 :(得分:1)

基于Jeffin P S的回答(效果很好),我提出了一个通过克隆原始元数据对象来创建新元数据对象的版本。这样,特定于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);