8

我正在使用亚马逊 AWS 开发工具包的 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 和 Content-Type)。我已经尝试了上述所有方式的组合(有和没有 Content-Type、Cache-control、meta 等)并得到相同的结果。

如何重置元数据?

4

3 回答 3

6

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

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

于 2012-08-07T13:48:21.667 回答
3

根据 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);
于 2019-01-09T11:13:54.760 回答
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);
于 2015-04-23T05:30:37.457 回答