簡體   English   中英

如何在Amazon S3中更改對象上的元數據

[英]How to change metadata on an object in Amazon S3

如果您已經將對象上傳到Amazon S3存儲桶,那么如何使用API​​更改元數據? 可以在AWS管理控制台中執行此操作,但尚不清楚如何以編程方式完成此操作。 具體來說,我在Python中使用boto API,從閱讀源代碼中可以明顯看出,使用key.set_metadata僅創建對象之前有效 ,因為它只會影響本地字典。

看來您需要使用帶有x-amz-metadata-directive: REPLACE標頭的“ PUT對象(復制)”以及x-amz-metadata-directive: REPLACE來覆蓋對象本身。 在boto中,可以這樣進行:

k = k.copy(k.bucket.name, k.name, {'myKey':'myValue'}, preserve_acl=True)

請注意,您未包含在舊詞典中的任何元數據都將被刪除。 因此,要保留舊屬性,您需要執行以下操作:

k.metadata.update({'myKey':'myValue'})
k2 = k.copy(k.bucket.name, k.name, k.metadata, preserve_acl=True)
k2.metadata = k.metadata    # boto gives back an object without *any* metadata
k = k2;

我差點錯過了此解決方案,在介紹不正確標題的問題中暗示了這一問題,該問題實際上是與該問題不同的問題: 更改現有S3對象的Content-Disposition

為了在S3文件上設置元數據,請不要提供目標位置,因為僅源信息就足以設置元數據。

final ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata(metadataKey, value);
final CopyObjectRequest request = new CopyObjectRequest(bucketName, keyName, bucketName, keyName)
  .withSourceBucketName(bucketName)
  .withSourceKey(keyName)
  .withNewObjectMetadata(metadata);

s3.copyObject(request);`

如果要元數據遠程存儲,請使用set_remote_metadata

示例: key.set_remote_metadata({'to_be': 'added'}, ['key', 'to', 'delete'], {True/False})

實現在這里: https : //github.com/boto/boto/blob/66b360449812d857b4ec6a9834a752825e1e7603/boto/s3/key.py#L1875

您可以使用copy命令更改元數據而無需重新加載對象。 看到這個問題: 是否可以在不下載整個對象的情況下更改S3對象上的標頭?

對於第一個答案,最好在元數據中包含原始內容類型,例如:

key.set_metadata('Content-Type', key.content_type) 

在Java中,您可以將對象復制到同一位置。 在此,復制對象時不會復制元數據。 您必須獲取原始元數據並設置為復制請求。 推薦使用此方法來插入或更新Amazon S3對象的元數據

ObjectMetadata metadata = amazonS3Client.getObjectMetadata(bucketName, fileKey);
ObjectMetadata metadataCopy = new ObjectMetadata();
metadataCopy.addUserMetadata("yourKey", "updateValue");
metadataCopy.addUserMetadata("otherKey", "newValue");
metadataCopy.addUserMetadata("existingKey", metadata.getUserMetaDataOf("existingValue"));

CopyObjectRequest request = new CopyObjectRequest(bucketName, fileKey, bucketName, fileKey)
      .withSourceBucketName(bucketName)
      .withSourceKey(fileKey)
      .withNewObjectMetadata(metadataCopy);

amazonS3Client.copyObject(request);

這是對我有用的代碼。 我正在使用aws-java-sdk-s3版本1.10.15

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(fileExtension.getMediaType());

s3Client.putObject(new PutObjectRequest(bucketName, keyName, tempFile)
                    .withMetadata(metadata));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM