Как мне установить Content-Type существующего ключа S3 с помощью boto3?

Я хочу обновить Content-Type существующего объекта в корзине S3, используя boto3, но как мне это сделать, не загружая файл повторно?

    file_object = s3.Object(bucket_name, key)
    print file_object.content_type
    # binary/octet-stream
    file_object.content_type = 'application/pdf'
    # AttributeError: can't set attribute

Есть ли способ для этого, который я пропустил в boto3?

Связанные вопросы:


person leo    schedule 10.06.2016    source источник


Ответы (1)


Похоже, что в boto3 для этого не существует какого-либо метода, но вы можете скопировать файл, чтобы перезаписать себя.

Чтобы сделать это с помощью низкоуровневого API AWS через boto3, выполните следующие действия:

s3 = boto3.resource('s3')
api_client = s3.meta.client
response = api_client.copy_object(Bucket=bucket_name,
                                  Key=key,
                                  ContentType="application/pdf",
                                  MetadataDirective="REPLACE",
                                  CopySource=bucket_name + "/" + key)

Оказывается, что MetadataDirective="REPLACE" требуется S3 для перезаписи файла, в противном случае вы получите сообщение об ошибке This copy request is illegal because it is trying to copy an object to itself without changing the object's metadata, storage class, website redirect location or encryption attributes. .

Или вы можете использовать copy_from, как отметил Джордон Филлипс в комментариях:

s3 = boto3.resource("s3")
object = s3.Object(bucket_name, key)
object.copy_from(CopySource={'Bucket': bucket_name,
                             'Key': key},
                 MetadataDirective="REPLACE",
                 ContentType="application/pdf")
person leo    schedule 10.06.2016
comment
Копия тоже есть в ресурсе. документы - person Jordon Phillips; 10.06.2016
comment
@JordonPhillips Еще лучше, спасибо! Если вы хотите добавить это в качестве ответа, я приму это - person leo; 11.06.2016