Как загрузить метаданные вместе с изображением с помощью библиотеки запросов Python? - PullRequest
0 голосов
/ 03 февраля 2019

Я пытаюсь загрузить изображение с помощью библиотеки запросов, которая использует presigned_post url

PS Я не хочу использовать boto3 для загрузки изображений

Я попытался передать метаданные в заголовки / данные /файлы, но ни один из подходов не сработал.Файлы загружаются на S3, но метаданные отсутствуют при извлечении объекта.

Вот код для генерации политики и URL

def get_presigned_post_url(bucket_name, key_name, expiry_time=300):
    presigned_post = s3.generate_presigned_post(
        Bucket=bucket_name,
        Key=key_name,
        Conditions=[
            ['content-length-range', 0, 1024*1024*25]
        ],
        ExpiresIn=expiry_time
    )

    return presigned_post['url'], presigned_post['fields']

Вот код, который я использую для загрузкиизображение и его метаданные

bucket_name = "testbucket"
key_name = "testkey" 
post_url, fields = get_presigned_post_url(bucket_name, key_name)
config = {
        "metadata1": "value1"
}
fields['file'] = open('test.jpg', 'rb').read()
for k,v in config.items():
    headers[f"x-amz-meta-{k}"] = str(v)

response = requests.post(post_url, files=fields, headers=headers)

Вот код для извлечения объекта

import boto3
import datetime

def default(o):
   if isinstance(o, (datetime.date, datetime.datetime)):
      return o.isoformat()

s3 = boto3.client('s3')
response = s3.head_object(Bucket=bucket_name, Key=key_name)
print(json.dumps(response, indent=4, default=default))

Что-то мне не хватает? Или невозможно обновить метаданные, используя запросы?Я использую Python 3.7 и boto3 1.9.71

...