2012-05-10 72 views
2

我在將cURL選項轉換爲將文件上傳到雲服務器Picloud的Python請求中遇到了一些困難。根據他們的描述,第一步是向PiCloud發出一個創建新文件的請求,以創建此上傳的票據。第二步是發送從此故障單提取的指令以上載文件。如何將cURL轉換爲Python請求語言?

第一步我就行了。但對第二個問題有疑問。

第1步,創建一個上傳票。

捲曲聲明:

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

我的請求的代碼:

r = requests.post('https://api.picloud.com/file/new/',auth=(api_key,api_secretkey), verify=False, data={'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/"}} 

第2步,上傳的文件。

基本上,我在翻譯cURL -L-F選項時不太明白。根據cURL的指示,-L表示重定向,-F表示以表單填寫。

捲曲聲明:

$ 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

您發佈的門票是否真的是實際的現場回覆?你真的發送字符串文字「信息」作爲這些元素的數據?這看起來像一些複製粘貼文檔文本。我發現一些S3文檔提示,例如,acl應該是私有的,公共讀取的,公共讀寫的或認證讀取的。這可能會解釋你得到的錯誤,至少。 –

+0

感謝您的回覆。我已經更新了真正的機票。 –

+0

現在嘗試用您在票證中獲得的值替換請求正文中的值。請注意,爲了使這項工作長期進行,您需要將其設爲動態,以便獲得票證,從票證中提取值,然後使用票證中收到的值創建第二個請求。 –

回答

1

它看起來像你不需要params或AWSAccessKeyID在正文中。另外,對我來說,他們告訴你在內容中插入Content-Type而不是在標題中設置它,這似乎很奇怪......無論如何,您還需要在請求中設置標題。根據curl文檔,-F將頭文件中的Content-Type設置爲multipart/form-data,因此您應該在Python中執行此操作。