これは、4月6日からのガーナートの回答に対するフォローアップです。
資格情報を持つ署名付きURLサーバー側を生成しています。クライアントにコンテンツを直接アップロードできるように、クライアントに渡します。私は、クライアントが任意のサイズのファイルをアップロードするのに十分遠くまでは信じますが、セキュリティトークンを与えるには十分ではありません。私は、クライアントが要求の一部としてどのくらいの量のコンテンツをサーバーに伝えるのを避けたかったのです。したがって、私のフォローアップの答え。
ヘッダーにコンテンツの長さを指定したり、force_http = Trueを指定することなく、PUTメソッドの署名付きURLを取得できました。 garnaatのanswereのように :
>>> 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
後のBoto 2.31.1を使用して
私はカールを使ってファイルを投稿することができました:
>>> os.system('curl --request PUT --upload-file true_measure/test_files/test_file_w_content.txt "'+temp_url+'"')
私は通常、python requestsを使ってテストとデバッグを行うので、これを理解するのは非常に困難でした。しかし、私は認証失敗を取得しようとすると、私はそれを使用して、これらのbotoのいずれかにリクエストを使って署名付きURLを生成しました。私はこれを完全にデバッグしていませんが、curlが生成するものと比べてリクエストがいくつか追加されていると思われます。
このフォローアップの回答は、他の誰かが私が経験したデバッグの苦労を惜しみなく願っています。
は、その新たなファイルですか?新しいファイルを作成するには、 'PUT'ではなく' POST'を使うべきです。 – vartec
@vartec: "新しいファイル"とはどういう意味ですか?私の使用例では、あるキーに新しいキーをアップロードする必要があることがあります。古いキーを上書きする必要があることがあります。だから私は 'PUT'と 'POST'のコード例が必要だと思う。 –