如何使用Amazon S3 SDK更新元数据(How to update metadata usin

2019-09-20 23:09发布

我使用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和仅内容类型)。 我已经试过以上(有和没有的内容类型,缓存控制,元等)的组合,所有的方式,并得到同样的结果。

如何重置元数据?

Answer 1:

我刚刚发现,复制到反对本身其实正确更改页眉。 我将其复制到第二个文件用于测试目的,以避免覆盖原来的。

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



Answer 2:

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


Answer 3:

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


文章来源: How to update metadata using Amazon S3 SDK