2012-05-10 24 views
2

私は、ファイルをクラウドサーバーPicloudにアップロードするために、cURLオプションをPythonリクエストに変換するのにいくつかの問題があります。その説明に基づいて、最初のステップは、このアップロード用のチケットを作成するためにPiCloudに新しいファイルを作成する要求をPOSTすることです。 2番目のステップは、このチケットから抽出された指示を送信してファイルをアップロードすることです。cURLをPythonの要求言語に翻訳するには?

最初の手順で問題はありません。しかし、第二のものについて質問があります。

最初の手順では、アップロードチケットを作成します。

cURLの声明:

$ curl -k -u 'key:secret_key' -X POST https://api.picloud.com/file/new/ -d name=file_name 

マイリクエストコード:ファイルをアップロードし、

{"ticket": {"AWSAccessKeyId": "AKIAJCY7JV52WD4MJSNQ", 
"success_action_redirect": "https://api.picloud.com/file/uploaded/3303/4600939/4a6317595a03f85fbbe9102b2454119dc35d3969/", 
"acl": "private", 
"key": "44ec7b76cb3e046986e82b3f13b2da30208d43a5/your_file_name", 
"signature": "TzFhvowtJnBm2+HCvTSlZkBxM5w=", 
"policy": "eyJjb25kaXRpb25zIjogW3siYnVja2V0IjogInBpLXVzZXItZmlsZXMifSwgeyJrZXkiOiAiNDRlYzdiNzZjYjNlMDQ2OTg2ZTgyYjNmMTNiMmRhMzAyMDhkNDNhNS95b3VyX2ZpbGVfbmFtZSJ9LCB7ImFjbCI6ICJwcml2YXRlIn0sIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cHM6Ly9hcGkucGljbG91ZC5jb20vZmlsZS91cGxvYWRlZC8zMzAzLzQ2MDA5MzkvNGE2MzE3NTk1YTAzZjg1ZmJiZTkxMDJiMjQ1NDExOWRjMzVkMzk2OS8ifSwgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgIiJdXSwgImV4cGlyYXRpb24iOiAiMjAxMi0wNS0xMVQwMTo1MDo0NFoifQ==", 
"Content-Type": "application/octet-stream"}, 
"params": {"action": "https://pi-user-files.s3-external-1.amazonaws.com/"}} 

第二ステップ:

r = requests.post('https://api.picloud.com/file/new/',auth=(api_key,api_secretkey), verify=False, data={'name':'file_name'}) 

チケットは次のようになります。

基本的には、cURL -L-Fのオプションの翻訳にはあまり理解していません。 cURLからの指示に基づいて、-Lはリダイレクトを意味し、-Fはフォームとして記入することを意味します。

cURLの声明:

$ curl -L "https:/.s3.amazonaws.com/" -F "AWSAccessKeyId=1" -F "success_action_redirect=https://api.picloud.com/file/uploaded/1234" -F "acl=info" -F "key=info" -F "signature=info" -F "policy=info" -F content-type="info" -F file=your_file_to_upload 

私の悪いトライアル:

up_d={"AWSAccessKeyId": "AKIAJCY7JV52WD4MJSNQ", "success_action_redirect": "https://api.picloud.com/file/uploaded/3303/4596631/28ec3c3898bec2523759e15cd62fb39fa62b5c53/", 
     "acl": "private", "key": "44ec7b76cb3e046986e82b3f13b2da30208d43a5/your_file_name", "signature": "BLsaltt+Ohua4tPPISr2eV2Tr8c=", 
     "policy": "eyJjb25kaXRpb25zIjogW3siYnVja2V0IjogInBpLXVzZXItZmlsZXMifSwgeyJrZXkiOiAiNDRlYzdiNzZjYjNlMDQ2OTg2ZTgyYjNmMTNiMmRhMzAyMDhkNDNhNS95b3VyX2ZpbGVfbmFtZSJ9LCB7ImFjbCI6ICJwcml2YXRlIn0sIHsic3VjY2Vzc19hY3Rpb25fcmVkaXJlY3QiOiAiaHR0cHM6Ly9hcGkucGljbG91ZC5jb20vZmlsZS91cGxvYWRlZC8zMzAzLzQ1OTY2MzEvMjhlYzNjMzg5OGJlYzI1MjM3NTllMTVjZDYyZmIzOWZhNjJiNWM1My8ifSwgWyJzdGFydHMtd2l0aCIsICIkQ29udGVudC1UeXBlIiwgIiJdXSwgImV4cGlyYXRpb24iOiAiMjAxMi0wNS0xMVQwMDozOTo0OFoifQ==", 
     "Content-Type": "application/octet-stream", "file":"new 2.txt"} 
    k1=requests.post('https://pi-user-files-test.s3.amazonaws.com/', data=up_d) 

エラーメッセージがあなたの助けを

<Error><Code>InvalidArgument</Code><Message>Conflicting query string parameters: acl, policy</Message><ArgumentValue>acl</ArgumentValue><ArgumentName>ResourceType</ArgumentName><RequestId>4767425F264FB0CA</RequestId><HostId>K/pAE6BXLJaRRo56ETWw2uYZed8GR+1+VPPU3TI0pZGNyrqz/PAWSzuwtIAHz9eE</HostId></Error> 

感謝です!

+0

投稿したチケットは本当に実際のライブレスポンスですか?実際に文字列リテラル "info"をこれらの要素のデータとして送信していますか?それはいくつかのコピー貼り付けられたドキュメントのテキストのように見えます。たとえば、aclはプライベート、パブリック・リード、パブリック・リード・ライト、または認証されたリードのいずれかでなければならないと示唆しているS3ドキュメントを見つけました。それはおそらく、少なくともあなたが持っているエラーを説明するでしょう。 –

+0

返事をありがとう。私は実際のチケットを更新しました。 –

+0

リクエスト本体の値をチケットの値に置き換えてみてください。これを長期的に機能させるには、動的にする必要があるので、チケットを取得し、チケットから値を取り出し、次にチケットで受け取った値で2番目の要求を行います。 –

答えて

1

ボディにparamsやAWSAccessKeyIDは必要ないようです。また、ヘッダーに設定するのではなく、Content-Typeを本文に詰め込むように指示していることは奇妙に思えます。いずれの場合も、要求にヘッダーを設定する必要があります。 curlのドキュメントごとに、-FはヘッダーのContent-Typeをmultipart/form-dataに設定するので、Pythonでもそうしなければなりません。

関連する問題