Pythonのリクエストライブラリを使用してAmazonS3エンドポイントにリクエストをPOSTしようとしています。リクエストには、実際のファイルのPOSTが含まれているため、multipart/form-dataの種類があります。
私が取り組んでいるAPIで指定されている要件の1つは、パラメーターを最後file
に投稿する必要があるということです。Requestsはディクショナリを使用してmultipart/form-dataをPOSTし、ディクショナリは指示された順序に従わないため、それをと呼ばれるOrderedDictに変換しました。投稿する前は次のようになります。payload
{'content-type': 'text/plain',
'success_action_redirect': 'https://ian.test.instructure.com/api/v1/files/30652543/create_success?uuid=<opaque_string>',
'Signature': '<opaque_string>',
'Filename': '',
'acl': 'private',
'Policy': '<opaque_string>',
'key': 'account_95298/attachments/30652543/log.txt',
'AWSAccessKeyId': '<opaque_string>',
'file': '@log.txt'}
そして、これは私がそれを投稿する方法です:
r = requests.post("https://instructure-uploads.s3.amazonaws.com/", files = payload)
応答は500エラーなので、ここで何が問題なのかよくわかりません。RequestsでのOrderedDictの使用に関係していると推測しています。RequestsがOrderedDictsをサポートしている、またはサポートしていないことを示唆するドキュメントは見つかりませんでした。まったく違うものかもしれません。
リクエストが失敗する原因となる他の何かがあなたに突き出ていますか?必要に応じて、詳細を提供できます。
さて、Martijn Pietersの以前のコメントに基づいて、更新します。
log.txtファイルを参照する方法を、次のように作成済みのupload_data
辞書に追加することで変更しました。
upload_data['file'] = open("log.txt")
結果の辞書を印刷すると、次のようになります。
{'AWSAccessKeyId': '<opaque_string>',
'key': '<opaque_string>',
'Policy': '<opaque_string>',
'content-type': 'text/plain',
'success_action_redirect': 'https://ian.test.instructure.com/api/v1/files/30652688/create_success?uuid=<opaque_string>',
'Signature': '<opaque_string>',
'acl': 'private',
'Filename': '',
'file': <_io.TextIOWrapper name='log.txt' mode='r' encoding='UTF-8'>}
file
キーのその値は正しいように見えますか?
それをRequestBinに投稿すると、これが表示されます。これは、Martinの例と非常によく似ています。
POST /1j92n011 HTTP/1.1
User-Agent: python-requests/1.1.0 CPython/3.3.0 Darwin/12.2.0
Host: requestb.in
Content-Type: multipart/form-data; boundary=e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Length: 2182
Connection: close
Accept-Encoding: identity, gzip, deflate, compress
Accept: */*
--e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Disposition: form-data; name="AWSAccessKeyId"; filename="AWSAccessKeyId"
Content-Type: application/octet-stream
<opaque_string>
--e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Disposition: form-data; name="key"; filename="key"
Content-Type: application/octet-stream
<opaque_string>
--e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Disposition: form-data; name="Policy"; filename="Policy"
Content-Type: application/octet-stream
<opaque_string>
--e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Disposition: form-data; name="content-type"; filename="content-type"
Content-Type: application/octet-stream
text/plain
--e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Disposition: form-data; name="success_action_redirect"; filename="success_action_redirect"
Content-Type: application/octet-stream
https://ian.test.instructure.com/api/v1/files/30652688/create_success?uuid=<opaque_string>
--e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Disposition: form-data; name="Signature"; filename="Signature"
Content-Type: application/octet-stream
<opaque_string>
--e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Disposition: form-data; name="acl"; filename="acl"
Content-Type: application/octet-stream
private
--e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Disposition: form-data; name="Filename"; filename="Filename"
Content-Type: application/octet-stream
--e8c3c3c5bb9440d1ba0a5fe11956e28d
Content-Disposition: form-data; name="file"; filename="log.txt"
Content-Type: text/plain
This is my awesome test file.
--e8c3c3c5bb9440d1ba0a5fe11956e28d--
ただし、 https: //instructure-uploads.s3.amazonaws.com/にPOSTしようとすると、500が返されます。開いているファイルオブジェクトをに追加してからfiles
、他のすべての値を別のdictで送信しようとしましdata
たが、それも機能しませんでした。