이것은 garnaat의 답변에 대한 후속 조치입니다.
저는 자격 증명이있는 서명 된 URL 서버 쪽을 생성하고 있으며, 클라이언트가 콘텐츠를 직접 업로드 할 수 있도록 클라이언트에 전달합니다. 클라이언트가 임의 크기의 파일을 업로드 할 수있을만큼 충분히 신뢰하지만 보안 토큰을 제공하기에 충분하지 않습니다. 클라이언트가 요청 내용의 일부로 콘텐츠의 크기를 알리는 것을 피하고 싶었습니다. 그러므로 내 후속 답변.
헤더에 컨텐츠 길이를 지정하거나 force_http = True를 지정하지 않고 PUT 메소드에 대한 서명 된 URL을 얻을 수있었습니다. garnaat의 answere에로 : BOTO 2.31.1를 사용
다음
>>> import boto
>>> c =boto.connect_s3()
대신 내가 사용 :
https://s3_location/bucket_name/s3_key?Signature=Ew407JMktSIcFln%2FZe00VroCmTU%3D&Expires=1405647669&AWSAccessKeyId=kM__pEQo2AEVd_Juz4Qq
:
>>> temp_url = c.generate_url(seconds_available, 'PUT', bucket_name, s3_key)
이 다음과 같은 형태의 URL을 생성
나는 컬을 사용하여 파일을 올릴 수있었습니다 :
>>> os.system('curl --request PUT --upload-file true_measure/test_files/test_file_w_content.txt "'+temp_url+'"')
일반적으로 python requests을 사용하여 테스트 및 디버그를 작성했기 때문에이 작업을 수행하는 데 어려움이있었습니다. 그러나 나는 그것을 사용하려고 시도 할 때 인증 실패를받습니다. 요청을 사용하여 서명 된 URL을 생성 한 boto 중 하나에 파일을 저장하려고합니다. 필자는 이것을 완전히 디버깅하지는 못했지만 요청이 컬이 생성하는 것과 비교할 때 몇 가지 추가 헤더를 추가하기 때문인 것으로 의심됩니다.
나는이 후속 답변이 내가 겪은 디버깅 통증을 다른 사람에게 안겨주기를 바랍니다.
? 새 파일을 만들려면'PUT'이 아닌'POST'를 사용해야합니다. – vartec
@vartec : "새 파일"이란 무엇입니까? 필자의 경우 때때로 새 버킷을 특정 버킷에 업로드해야 할 때가 있으며 때로는 이전 키를 덮어 쓸 필요가 있습니다. 그래서 'PUT'과 'POST'에 대한 코드 예제가 필요하다고 생각합니다. –