如何更新现有Amazon S3文件的元数据?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何更新现有Amazon S3文件的元数据?相关的知识,希望对你有一定的参考价值。
我需要更新所有AmazonS3的云文件中的缓存控制头。但是,我无法弄清楚如何使用jclouds API。我正在使用apache jclouds插件。我得到了两个相关的答案:
- jclouds : how do I update metadata for an existing blob?
- Set Expires header for an existing S3 object using AWS Java SDK
第一个答案是建议使用SwiftKey Api类,这在grails的jcloud插件中是不可用的。第二个答案是使用AWS java sdk,其中已经有一个grails包装插件https://grails.org/plugin/aws-sdk,但它不支持元数据更新。
可以通过执行对象复制来更改元数据(请参阅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);
这是哲学上的“更新”取决于你自己决定。
你不能:
每个Amazon S3对象都有数据,密钥和元数据。对象键(或键名)唯一标识存储桶中的对象。对象元数据是一组名称 - 值对。您可以在上载时设置对象元数据。上载对象后,无法修改对象元数据。修改对象元数据的唯一方法是制作对象的副本并设置元数据。
http://docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html
截至2018年3月,最新版本的AWS SDK for .NET Core已发生变化。它现在使用异步编程。许多方法签名已经改变。虽然如果没有Dan建议的对象复制解决方案仍然无法更改元数据,那么这样做的代码就有了。
我的解决方案是使用修改后的元数据更新现有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);
以上是关于如何更新现有Amazon S3文件的元数据?的主要内容,如果未能解决你的问题,请参考以下文章
Amazon S3,如何将 JSON 文件复制到另一个在更新原始文件时更新的存储桶?