2012-08-07 73 views
3

我正在使用亚马逊AWS SDK的PHP版本。我有一堆带有Expires标题的文件;我想删除该标题并添加Cache-control标题。 update_object函数让我添加标题但不删除它们。如何使用Amazon S3 SDK更新元数据

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)完全相同的标头。我已经尝试了上述的所有方式组合(有和没有内容类型,缓存控制,元等),并得到相同的结果。

如何重置元数据?

回答

2

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

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

+0

的更新元数据这一措辞有些奇怪。为什么会复制到不同的文件“变”任何头?你的意思是它没有在新文件上设置标题? – 2013-11-25 22:15:37

+0

@alex对不起,如果它不明确。它应该改变标题,因为在请求中设置了新的标题。如果使用headers参数复制到相同的文件名(例如FileA.jpg - > FileA.jpg),它将更改标题,但如果复制到其他文件(例如FileA.jpg - > FileB.jpg),则提供的标题为没有设置。 – DisgruntledGoat 2013-11-26 01:37:56

1

在Java中,您可以将对象复制到同一位置。 这里元数据在复制对象时不会复制。 您必须获取原始的元数据并设置为复制请求。推荐 这种方法更多地插入或亚马逊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);