web-dev-qa-db-ja.com

既存のAmazon S3ファイルのメタデータを更新するにはどうすればよいですか?

すべてのAmazonS3のクラウドファイルのキャッシュコントロールヘッダーを更新する必要があります。ただし、jclouds APIを使用してそれをどのように行うかはわかりません。 Apache jcloudsプラグインを使用しています。そして、私は2つの関連する答えを得ました:

最初の答えは、grailsのjcloudプラグインでは利用できないSwiftKey Apiクラスを使用することです。 2番目の答えは、AWS Java sdkを使用することです。このSDKには、既にgrailsラッピングプラグインがあります https://grails.org/plugin/aws-sdk しかし、メタデータの更新はサポートしていません。

24

オブジェクトのコピーを実行してメタデータを変更することができます( Amazon S3 SDKを使用してメタデータを更新する方法 を参照):

ObjectMetadata metadataCopy = new ObjectMetadata();
// copy previous metadata
metadataCopy.addUserMetadata("newmetadata", "newmetadatavalue");

CopyObjectRequest request = new CopyObjectRequest(bucketName, existingKey, bucketName, existingKey)
      .withNewObjectMetadata(metadataCopy);

amazonS3Client.copyObject(request);

これが哲学的に「更新」であるかどうかは、あなたが決めることです。

31
Dan Gravell

できません:

各Amazon S3オブジェクトには、データ、キー、メタデータがあります。オブジェクトキー(またはキー名)は、バケット内のオブジェクトを一意に識別します。オブジェクトメタデータは、名前と値のペアのセットです。オブジェクトのメタデータは、アップロード時に設定できます。 オブジェクトをアップロードした後、オブジェクトのメタデータを変更することはできません。オブジェクトのメタデータを変更する唯一の方法は、オブジェクトのコピーを作成してメタデータを設定することです。

http://docs.aws.Amazon.com/AmazonS3/latest/dev/UsingMetadata.html

22
E.J. Brennan

PHPの例

この質問はPHP固有のものではありませんが、Googleでの最高の結果であるため、誰かを助けるかもしれません。

これにより、既存のオブジェクトが上書きされます。

$client = new \Aws\S3\S3Client([
    'version' => '2006-03-01',
    'region' => 'BUCKET-REGION'
]);

$updateResponse = $client->copyObject([
    'Key' => 'OBJECTKEY',
    'Bucket' =>  'MYBUCKET',
    'CopySource' => 'MYBUCKET/OBJECTKEY',
    'MetadataDirective' => 'REPLACE',
    'Metadata' => [
        'width' => 441,
        'height' => 189
    ]
]);

The Content Type was an existing metadata item

1
styks