Este es un seguimiento de la respuesta de garnaat del 6 de abril de 12.
Estoy generando un lado del servidor de URL firmado, donde tengo credenciales, y lo paso a un cliente para que un cliente pueda cargar contenido directamente. Confío en el cliente lo suficiente como para permitirle cargar archivos de tamaño arbitrario, pero no lo suficiente como para darle tokens de seguridad. Quería evitar que el cliente le dijera al servidor qué tan grande sería su contenido como parte de la solicitud. De ahí mi respuesta de seguimiento.
Pude obtener la URL firmada para que el método PUT funcionara sin especificar la longitud del contenido en los encabezados o especificando force_http = True.
Usando Boto 2.31.1: como en answere de garnaat:
>>> import boto
>>> c =boto.connect_s3()
entonces en lugar de eso utiliza:
>>> temp_url = c.generate_url(seconds_available, 'PUT', bucket_name, s3_key)
Esto produjo una dirección URL en la forma siguiente:
https://s3_location/bucket_name/s3_key?Signature=Ew407JMktSIcFln%2FZe00VroCmTU%3D&Expires=1405647669&AWSAccessKeyId=kM__pEQo2AEVd_Juz4Qq
Pude usar curl para publicar un archivo:
>>> os.system('curl --request PUT --upload-file true_measure/test_files/test_file_w_content.txt "'+temp_url+'"')
Tuve un momento muy difícil para descifrar esto porque usualmente uso python requests para escribir pruebas y depurar; sin embargo, recibo un error de autenticación cuando trato de usarlo para poner un archivo en uno de estos urls firmados generados por boto usando solicitudes. No he depurado por completo esto, pero sospecho que es porque las solicitudes están agregando algunos encabezados adicionales en comparación con lo que curl produce.
Espero que esta respuesta de seguimiento le ahorre a alguien más el dolor de depuración que sufrí.
es que un nuevo archivo? Para crear un archivo nuevo, debe usar 'POST', no' PUT' – vartec
@vartec: ¿Qué quiere decir "un nuevo archivo"? En mi caso de uso, a veces tengo que cargar una nueva clave en un cubo determinado, a veces tengo que sobrescribir la clave anterior. Así que creo que necesito el ejemplo de código para 'PUT' y 'POST'. –