Это ответ на вопрос ответа garnaat от 6 апреля '12.
Я создаю подписанную сторону URL-сервера, где у меня есть учетные данные, и передаю ее клиенту, чтобы клиент мог напрямую загружать контент. Я доверяю клиенту достаточно далеко, чтобы позволить ему загружать файлы произвольного размера, но недостаточно, чтобы придать ему токены безопасности. Я хотел избежать того, чтобы клиент сообщил серверу, насколько его содержимое будет частью запроса. Отсюда мой последующий ответ.
Мне удалось получить подписанный URL-адрес для метода PUT, не указав длину содержимого в заголовках или указав force_http = True.
Использование Boto 2.31.1: как в answere garnaat в:
>>> import boto
>>> c =boto.connect_s3()
то вместо этого я использовал:
>>> temp_url = c.generate_url(seconds_available, 'PUT', bucket_name, s3_key)
это произвело URL в следующей форме:
https://s3_location/bucket_name/s3_key?Signature=Ew407JMktSIcFln%2FZe00VroCmTU%3D&Expires=1405647669&AWSAccessKeyId=kM__pEQo2AEVd_Juz4Qq
Тогда я смог использовать завиток, чтобы опубликовать файл:
>>> os.system('curl --request PUT --upload-file true_measure/test_files/test_file_w_content.txt "'+temp_url+'"')
У меня было очень трудное время выяснить это, потому что я обычно использую python requests для написания тестов и отладки; однако я получаю отказ аутентификации, когда пытаюсь использовать его, чтобы поместить файл в один из этих сгенерированных сгенерированных подписей с использованием запросов. Я не полностью отлаживал это, но я подозреваю, что это потому, что запросы добавляют несколько дополнительных заголовков по сравнению с тем, что производит завиток.
Надеюсь, что этот ответ последует за ответом, если кто-то оставит отладочную боль, в которой я прошел.
Это новый файл? Чтобы создать новый файл, вы должны использовать 'POST', а не' PUT' – vartec
@vartec: Что значит «новый файл»? В моем случае использования иногда мне нужно загрузить новый ключ в определенное ведро, иногда мне нужно перезаписать старый ключ. Поэтому я думаю, что мне нужен пример кода для «PUT» и «POST». –