2015-09-18 6 views
10

Tüm AmazonS3'ün Bulut Dosyalarındaki önbellek denetimi üstbilgisini güncellemem gerekiyor. Ancak, jclouds API'sını kullanarak bunu nasıl yaptığımı anlayamıyorum. Apache jclouds eklentisini kullanıyorum. Ve iki ilgili cevaplar var:Varolan bir Amazon S3 dosyasının meta verilerini nasıl güncellerim?

ilk cevap grails 's jcloud eklenti mevcut değildir SwiftKey Api sınıfını kullanmak öne sürüyor

. İkinci cevap, zaten bir eklenti https://grails.org/plugin/aws-sdk sarma katmanları olan ancak meta veri güncellemesini desteklemeyen AWS java sdk kullanıyor.

cevap

14

Yapamazsınız:

Her Amazon S3 nesne verilerini, bir anahtar ve meta veriler bulunur. Nesne anahtarı (veya anahtar adı), bir kovadaki nesneyi benzersiz olarak tanımlar. Nesne meta verileri , bir ad-değer çiftleri kümesidir. Nesne meta verilerini, yüklediğiniz zaman olarak ayarlayabilirsiniz. Nesneyi yükledikten sonra, nesneyi meta verisini değiştiremezsiniz. Nesne meta verilerini değiştirmenin tek yolu, nesnenin kopyasını yapmak ve meta verileri ayarlamaktır.

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

+1

- Sağladığınız tarafta birlikte bağlantı, başka bulundu Yönetim konsolunu kullanarak nesne meta verilerini nasıl ekleyeceğinizi veya sildiğinizi gösteren Kullanıcı Kılavuzlarına bağlantı verin. Bu anlaşmazlığın üstesinden gelebileceğim tek çözüm, "nesne meta verilerini değiştiremezsiniz" dediğinde, belirli bir meta veri anahtarının değerini değiştiremezsiniz demektir. senin düşüncen nedir http://docs.aws.amazon.com/AmazonS3/latest/UG/Ekran TakibiObject.html – Israel

+0

Belki de meta verileri REST arabirimiyle değiştiremezsiniz, ancak yönetim konsolu üzerinden yapabilecekleriniz mi? (Sahnelerin arkasında muhtemelen klonlayıp siler). – kaifong

+0

Aşağıdaki çözümüme bakın, mevcut bir S3 nesnesini güncelleyebilir ve yeni/güncellenmiş meta verileri aynı anda ayarlayabilirsiniz. Kopyalama çözümüne benzer. – robnick

13

Bir nesne kopyasını yaparak meta değiştirmek mümkündür (How to update metadata using Amazon S3 SDK bakınız):

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

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

amazonS3Client.copyObject(request); 

bu bir "güncelleme" felsefi olarak olsun karar vermek size kalmış .

+1

Teşekkürler Dan, aynı şeyi yapıyordum. –

0

Mart 2018'de olduğu gibi, .NET Core için AWS SDK'nın en son sürümü değişti. Şimdi asenkron programlama kullanıyor. Yöntem imzalarının çoğu değişti. Yine de, Dan'in önerdiği nesne kopyalama çözümü olmadan meta verileri değiştiremezsiniz, ancak bunu yapacak kod vardır.

Çözümüm, mevcut S3 nesnesini değiştirilmiş meta verilerle güncellemektir.

Aşağıdakiler, tek bir meta veri değerini (anahtar ve yeni değere bağlı olarak) güncelleştirmek için çalışır. Ben meta ayarlamak için iki döngüler var ama sadece bir sahip olacak şekilde optimize edilebilir: Çok kafa karıştırıcı meta konu üzerine AWS belgeleri bulabilirsiniz

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