2011-01-21 37 views
35

オブジェクトをAmazon S3バケットにアップロード済みの場合は、APIを使用してメタデータをどのように変更しますか?これをAWS Management Consoleで行うことは可能ですが、プログラムでどのように実行できるかは不明です。具体的には、私はPythonでboto APIを使用しています。ソースを読むと、key.set_metadataを使用するとの前にはの前にオブジェクトが作成されます。Amazon S3でオブジェクトのメタデータを変更する方法

答えて

36

メタデータに加えてx-amz-metadata-directive: REPLACEヘッダーを持つ「PUTオブジェクト(コピー)」を使用してオブジェクトを上書きする必要があるようです。 botoでは、これは次のようにすることができます:

k = k.copy(k.bucket.name, k.name, {'myKey':'myValue'}, preserve_acl=True) 

古い辞書に含まれていないメタデータはすべて削除されます。

k.metadata.update({'myKey':'myValue'}) 
k2 = k.copy(k.bucket.name, k.name, k.metadata, preserve_acl=True) 
k2.metadata = k.metadata # boto gives back an object without *any* metadata 
k = k2; 

は、私はほとんどこの質問とは異なる問題について、実際のですが誤っ-というタイトルの質問にイントロにほのめかしているこのソリューションを、逃した:だから昔の属性を保持するためにあなたのような何かをする必要があります: Change Content-Disposition of existing S3 object

+2

古いメタデータと新しいメタデータの結合が行われている2番目のコード例では表示されません。コードを実行すると、オブジェクトのメタデータが最新のメタデータで上書きされます。 –

+1

動作するようですが、新しいキーがContent-Typeを失います.S3を使用してWeb画像を配信するときは本当に悪いです。 –

+0

AWS SDKを使用している場合は、[AmazonS3Client.copyObjectメソッド](http://docs.aws.amazon.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html#)を使用する必要があります。 copyObject(com.amazonaws.services.s3.model.CopyObjectRequest)) – glidester

10

S3ファイルにメタデータを設定するには、ソース情報だけでメタデータを設定すれば十分ですので、ターゲットの場所を指定しないでください。

それは例えば、メタデータに、オリジナルのコンテンツタイプを含めることをお勧めします最初の答えのために
final ObjectMetadata metadata = new ObjectMetadata(); 
metadata.addUserMetadata(metadataKey, value); 
final CopyObjectRequest request = new CopyObjectRequest(bucketName, keyName, bucketName, keyName) 
    .withSourceBucketName(bucketName) 
    .withSourceKey(keyName) 
    .withNewObjectMetadata(metadata); 

s3.copyObject(request);` 
+2

質問はPythonを求めましたが、これは私が見つけたJava SDKを使用した唯一の答えでした。ありがとう! –

+0

これは5GBを超えるファイルでは機能しません。 –

+0

重大なファイルの問題のメタデータが修正されているかどうかにかかわらず、タグは任意のサイズのファイルに置くことができますが、わかりません。 – kartik

1

key.set_metadata('Content-Type', key.content_type) 
+0

私はそれを使用して以来、しばらくしてきましたが、コピーの元の 'k.metadata'フィールドを通過するものの中にあることは間違いありません。 – natevw

7

あなたのメタデータが保存されたい場合は、遠隔set_remote_metadata

例を使用します。 key.set_remote_metadata({'to_be': 'added'}, ['key', 'to', 'delete'], {True/False})

実装方法は次のとおりです。 https://github.com/boto/boto/blob/66b360449812d857b4ec6a9834a752825e1e7603/boto/s3/key.py#L1875

+0

これは正解であり、@ natevwの答えが何を説明するのが最も簡単な方法です。それはボンネットの下で同じことをします。 'metadata_minus'と' preserve_acl'が必要であることに注意してください。 – nathancahill

+0

key.set_metadata()も機能します(ただし、既存のメタデータを置き換えます)。 set_remote_metadata()は、既存のメタデータの追加と削除をサポートします。これは正解でなければならず、現在のトップアンサーと比較してください。 – berniey

-1

Javaでは、オブジェクトを同じ場所にコピーできます。 ここでは、オブジェクトのコピー中にメタデータはコピーされません。 オリジナルのメタデータを取得し、コピー要求に設定する必要があります。 この方法は、よりここ

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

のAmazon S3オブジェクトのメタデータを挿入または更新することをお勧めします私のために働いていたコードがあります。私はaws-java-sdk-s3バージョン1.10.15を使用しています。

​​
関連する問題