这是 2012 年 4 月 6 日 garnaat 回答的后续行动。
我正在生成一个签名的 URL 服务器端,我有凭据,并将其传递给客户端,以便客户端可以直接上传内容。我足够信任客户端以允许它上传任意大小的文件,但不足以为其提供安全令牌。我想避免让客户端告诉服务器其内容作为请求的一部分有多大。因此我的后续回答。
我无需在标头中指定内容长度或指定 force_http=True 即可获得 PUT 方法的签名 url。
使用 Boto 2.31.1:如 garnaat 的回答:
>>> import boto
>>> c =boto.connect_s3()
然后我使用了:
>>> temp_url = c.generate_url(seconds_available, 'PUT', bucket_name, s3_key)
这产生了以下形式的网址:
https://s3_location/bucket_name/s3_key?Signature=Ew407JMktSIcFln%2FZe00VroCmTU%3D&Expires=1405647669&AWSAccessKeyId=kM__pEQo2AEVd_Juz4Qq
然后我可以使用 curl 发布文件:
>>> os.system('curl --request PUT --upload-file true_measure/test_files/test_file_w_content.txt "'+temp_url+'"')
我确实很难弄清楚这一点,因为我通常使用python 请求来编写测试和调试;但是,当我尝试使用它将文件放入这些 boto 使用请求生成的签名 url 之一时,我遇到了身份验证失败。我还没有完全调试这个,但我怀疑这是因为与 curl 产生的相比,请求添加了一些额外的标题。
我希望这个后续答案可以减轻其他人的调试痛苦。