截至2018年3月,AWS SDK for .NET Core的最新版本已更改。它現在使用異步編程。許多方法簽名已經改變。雖然如果沒有丹建議的對象複製解決方案,您仍然無法更改元數據,但是要這樣做的代碼具有。
我的解決方案是用修改後的元數據更新現有的S3對象。
我下面的作品更新單個元數據值(基於鍵和新值)。我有兩個迴路設置的元數據,但它可以進行優化,只是有一個:
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);
我找到了元數據的話題非常令人困惑的AWS文檔 - 沿邊鏈接您提供,我發現了另一個鏈接到他們的用戶指南,其中顯示瞭如何使用管理控制檯添加或刪除對象元數據。 唯一的解決這個矛盾,我可以想出,是當他們說:「你不能修改對象元數據」,他們的意思是,你不能修改特定的元數據項的值。你的想法是什麼? http://docs.aws.amazon.com/AmazonS3/latest/UG/EditingtheMetadataofanObject.html – Israel
或許他們的意思是你無法通過REST接口修改元數據,但你可以通過管理控制檯? (在幕後它可能會克隆和刪除)。 – kaifong
見下面我的解決方案,您可以更新現有的S3對象,並在同一時間設置新的/更新的元數據。它與複製解決方案類似。 – robnick