2012-05-10 3 views
2

파일 업로드를위한 Python 요청으로 cURL 옵션을 PicLoud 클라우드 서버로 변환하는 데 어려움이 있습니다. 설명에 따라, 첫 번째 단계는이 업로드를위한 티켓을 만들기 위해 PiCloud에 새 파일을 생성하라는 요청을 POST하는 것입니다. 두 번째 단계는이 티켓에서 추출한 지침을 전송하여 파일을 업로드하는 것입니다.cURL을 Python에 요청하는 방법 language?

첫 번째 단계에서 정상입니다. 그러나 두 번째 질문에 대해 질문하십시오.

첫 번째 단계에서는 업로드 티켓을 만듭니다.

컬 문 :

$ 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/"}} 

2 단계, 파일을 업로드 :

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 -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은 private, public-read, public-read-write 또는 authenticated-read 중 하나 여야한다고 제안하는 일부 S3 문서를 발견했습니다. 그게 적어도 당신이 가진 오류를 설명 할거야. –

+0

답장을 보내 주셔서 감사합니다. 나는 진짜 티켓을 갱신했다. –

+0

이제 요청 본문의 값을 티켓에있는 값으로 바꾸십시오. 이 작업을 장기적으로 진행하려면 티켓을 가져 와서 티켓에서 값을 가져온 다음 티켓에서받은 값으로 두 번째 요청을하도록이 동적을 만들어야합니다. –

답변

1

본문에 params 또는 AWSAccessKeyID가 필요없는 것 같습니다. 또한, 그들이 당신에게 Content-Type을 헤더에 설정하는 대신 몸에 끼어 들게한다고 말하는 것은 이상합니다. 어떤 경우에도 요청에 헤더를 설정해야합니다. 컬 문서에 따라, -F는 헤더의 Content-Type을 multipart/form-data로 설정하므로 파이썬에서도 그렇게해야합니다.

관련 문제