2015-09-18 17 views
10

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

を最初の答えは、Grailsの年代jcloudプラグインでは使用できませんSwiftKey APIクラスを使用することが示唆されます。 2番目の答えはAWS java sdkを使用していますが、すでにGrailsラッピングプラグインhttps://grails.org/plugin/aws-sdkがありますが、メタデータの更新はサポートされていません。

答えて

14

あなたがすることはできません:

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

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

+1

- あなたが提供してきた側面に沿ってリンクを、私は別のを見つけました管理コンソールを使用してオブジェクトメタデータを追加または削除する方法を示したユーザーガイドへのリンク。 このコンフリクトに対する唯一の解決策は、「オブジェクトメタデータを変更できません」と言うとき、特定のメタデータキーの値を変更できないということです。あなたの考えは何ですか? http://docs.aws.amazon.com/AmazonS3/latest/UG/MetadataofanObject.html – Israel

+0

おそらく、RESTインターフェースを介してメタデータを変更することはできませんが、管理コンソールから行うことができます。 (おそらくクローンして削除するシーンの裏に)。 – kaifong

+0

下記の私の解決策を見て、既存のS3オブジェクトを更新し、新しい/更新されたメタデータを同時に設定することができます。それはコピーソリューションに似ています。 – robnick

13

オブジェクトのコピーを実行することにより、メタデータを変更することが可能である(How to update metadata using 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); 

を、これは「更新」は哲学的であるかどうかを決定するのはあなた次第です。

+1

Danさん、ありがとうございます。私は同じことをやってしまいます。 –

0

2018年3月の時点で、.NETコア用のAWS SDKの最新バージョンが変更されました。現在、非同期プログラミングを使用しています。メソッドシグネチャの多くは変更されています。 Danが提案したオブジェクトコピーソリューションなしではメタデータを変更することはできませんが、そのためのコードがあります。

私の解決方法は、変更されたメタデータで既存のS3オブジェクトを更新することです。

以下は、(キーと新しい値に基づいて)単一のメタデータ値を更新するために働くものです。私は、メタデータを設定するための2つのループを持っているが、一つだけ持つように最適化することができます:私は非常に混乱したメタデータのトピックに関するAWSのドキュメントを見つける

string fileContents = string.Empty; 
Dictionary<string, string> fileMetaData = null; 

GetObjectRequest request = new GetObjectRequest 
{ 
    BucketName = bucketName, 
    Key = setKeyName 
}; 

var response = await s3Client.GetObjectAsync(request); 

// Read the contents of the file 
using (var stream = response.ResponseStream) 
{ 
    // Get file contents 
    TextReader tr = new StreamReader(stream); 
    fileContents = tr.ReadToEnd(); 
} 

// Create the File Metadata collection 
fileMetaData = new Dictionary<string, string>(); 
foreach (string metadataKey in response.Metadata.Keys) 
{ 
    fileMetaData.Add(metadataKey, response.Metadata[metadataKey]); 
} 

// Update the metadata value (key to update, new value) 
fileMetaData[metaDataKeyToUpdate] = metaDataNewValue; 

// Update the existing S3 object  
PutObjectRequest putRequest1 = new PutObjectRequest 
{ 
    BucketName = bucketName, 
    Key = setKeyName, 
    ContentBody = fileContents 
}; 

// Set the metadata 
foreach (string metadataKey in response.Metadata.Keys) 
{ 
    putRequest1.Metadata.Add(metadataKey, fileMetaData[metadataKey]); 
} 

PutObjectResponse response1 = await s3Client.PutObjectAsync(putRequest1); 
関連する問題