РАЗМЕЩЕНИЕ файлов в S3 с использованием запросов Python

У меня есть этот URL, сгенерированный методом generate_url(300, 'PUT', ...), и я хочу использовать библиотеку запросов для загрузить в него файл.

Это код, который я использовал: requests.put(url, data=content, headers={'Content-Type': content_type}), я также пробовал некоторые варианты этого, но ошибка, которую я получаю, всегда одна и та же.

Я каждый раз получаю ошибку 403 - SignatureDoesNotMatch от S3, что я делаю не так?


person Noah McIlraith    schedule 20.07.2012    source источник
comment
stackoverflow.com/questions/10044151/   -  person varela    schedule 20.07.2012


Ответы (2)


Вот как с помощью boto3 сгенерировать URL-адрес загрузки и PUT некоторые данные в нем:

session = boto3.Session(aws_access_key_id="XXX", aws_secret_access_key="XXX")
s3client = session.client('s3')
url = s3client.generate_presigned_url('put_object', Params={'Bucket': 'mybucket', 'Key': 'mykey'})

requests.put(url, data=content)
person Régis B.    schedule 26.07.2016

S3 требует токена аутентификации, если ваша корзина не является общедоступной для записи. Пожалуйста, проверьте токен.

Я бы посоветовал вам напрямую использовать boto.

bucket.new_key()
key.name = keyname
key.set_contents_from_filename(filename, {"Content-Type": content_type})
# optional if file public to read
bucket.set_acl('public-read', key.name)

Также проверьте, добавили ли вы заголовок Content-Length. Это необходимо и принимает участие в расчете хэша авторизации.

person varela    schedule 20.07.2012
comment
Не могли бы вы предоставить источник для этого? AFAICT ничем не отличается от generate_url(300, 'GET', ...), когда дело доходит до разрешений. - person Noah McIlraith; 20.07.2012
comment
Я проверил документы, вы правы, для авторизации нет никакой разницы. Вероятно, вы пропустили заголовки для generate_url. - person varela; 20.07.2012
comment
Звучит примерно так, я ничего не уточнил, какие заголовки нужны? (Ах, я не видел edit, Content-Length). - person Noah McIlraith; 20.07.2012
comment
Я думаю, что Content-Length, не уверен насчет других - person varela; 20.07.2012