如何更新现有Amazon S3文件的元数据?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何更新现有Amazon S3文件的元数据?相关的知识,希望对你有一定的参考价值。

我需要更新所有AmazonS3的云文件中的缓存控制头。但是,我无法弄清楚如何使用jclouds API。我正在使用apache jclouds插件。我得到了两个相关的答案:

第一个答案是建议使用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文件的元数据?的主要内容,如果未能解决你的问题,请参考以下文章

Boto3 S3 更新现有对象的元数据

jclouds:如何更新现有 blob 的元数据?

Amazon S3,如何将 JSON 文件复制到另一个在更新原始文件时更新的存储桶?

获取存储在 Amazon S3 上的图像的图像高度和宽度

如何使用Coldfusion fileExist检查Amazon S3上是否存在文件?

Laravel 5:如何将本地文件复制到 Amazon S3?