Подтвердить что ты не робот

Как изменить метаданные на объект в Amazon S3

Если вы уже загрузили объект в ведро Amazon S3, как вы меняете метаданные с помощью API? Это можно сделать в консоли управления AWS, но неясно, как это можно сделать программным путем. В частности, я использую API-интерфейс boto в Python и, читая исходный код, ясно, что использование key.set_metadata работает только до того, как объект создан, поскольку он просто влияет на локальный словарь.

4b9b3361

Ответ 1

Кажется, вам нужно перезаписать объект сам с помощью "PUT Object (Copy)" с заголовком 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

Ответ 2

Чтобы установить метаданные в файлах 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);`

Ответ 5

Для первого ответа рекомендуется включить исходный тип контента в метаданные, например:

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

Ответ 6

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

Ответ 7

вот код, который работал у меня. Я использую aws-java-sdk-s3 версию 1.10.15

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

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