我在将cURL选项转换为将文件上传到云服务器Picloud的Python请求时遇到了一些困难。根据他们的描述,第一步是发出请求以向PiCloud创建新文件以创建此上载的票证。第二步是发送从此故障单中提取的指令以上传文件。
第一步我没事。但对第二个问题有疑问。
第一步,创建一张上传票。
cURL声明:
$ 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/"}}
第二步,上传文件。
基本上,我在翻译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 :(得分:1)
看起来你不需要身体中的params或AWSAccessKeyID。此外,我觉得他们告诉你将Content-Type卡在正文中而不是在标题中设置它似乎很奇怪......无论如何,你还需要在你的请求中设置标题。根据curl文档,-F将标题中的Content-Type设置为multipart / form-data,所以你也应该在Python中这样做。