2015-02-04 1 views
1

Python 스크립트를 사용하여 S3에 직접 zip 파일을 업로드하려고하지만 일부 유니 코드 디코드 오류가 발생합니다.Python urllib2를 사용하여 AWS S3에 직접 zip 파일 업로드

내가하는 일은 Pre-Signed S3 Link를 생성 한 다음 데이터를 업로드하는 것입니다. 나는이 아래의 코드를 사용하여 파이썬에서 시도 할 때

curl -v -H "Content-Type: application/zip" -T /Path/To/Local/File.zip https://MySignedAWSS3Link 

그러나, 나는 오류가 발생 : 나는 이런 식으로 할 컬 사용할 때 업로드 작동하기 때문에 링크가 잘 작동 알고있다.

infile2 = open('/Path/To/Local/File.zip', 'rb') 
filedata2 = infile2.read() 
request2 = urllib2.Request("https://MySignedAWSS3Link",data=filedata2) 
request2.add_header('Content-Type', 'application/zip') 
request2.get_method = lambda: 'PUT' 
url2 = opener.open(request2) 

는 파이썬에서 다음과 같은 오류/역 추적을 얻을 :

> Traceback (most recent call last): 
    File "putFiles.py", line 44, in <module> 
    url2 = opener.open(request2) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 404, in open 
    response = self._open(req, data) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 422, in _open 
    '_open', req) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 382, in _call_chain 
    result = func(*args) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1222, in https_open 
    return self.do_open(httplib.HTTPSConnection, req) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/urllib2.py", line 1181, in do_open 
    h.request(req.get_method(), req.get_selector(), req.data, headers) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 973, in request 
    self._send_request(method, url, body, headers) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 1007, in _send_request 
    self.endheaders(body) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 969, in endheaders 
    self._send_output(message_body) 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/httplib.py", line 827, in _send_output 
    msg += message_body 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xca in position 10: ordinal not in range(128) 

은 내가 잘못 여기서 뭐하는 거지?

+0

[BOTO] (HTTP : //docs.pythonboto.org/ko/latest/)? –

+0

@DmitryNedbaylo 내가 아는 바로는 AWS 자격 증명을 boto에게 제공해야합니다. 이 스크립트는 배포되므로 AWS 자격 증명을 입력 할 수 없습니다. 따라서 나는 내 웹 사이트에서 가져온 미리 서명 된 URL을 사용하고 있습니다. AWS Secret Key 배포를 피하는 다른 아이디어를 사용할 수 있습니다. – SudoKill

+0

나를 예외 추적 할 수 있겠습니까? –

답변

1

역 추적에 따르면 요청에 추가 된 일부 문자열은 유니 코드입니다. 그러나 스크립트 예제에 따르면 모든 문자열은 ASCII 코드로 인코딩되어 있습니다 (Python2.7을 사용하고 있기 때문에).

파이썬 기본 인코딩을 UTF-8 (또는 OS가 사용자를 위해 설정)으로 설정하지 않는 이상 이상한 일이 발생합니다.

난 당신이 (ASCII로 모든 문자열을 변환)이 작동합니다 희망 :

infile2 = open('/Path/To/Local/File.zip', 'rb') 
filedata2 = infile2.read() 
request2 = urllib2.Request("https://MySignedAWSS3Link".encode('utf-8'),data=filedata2) 
request2.add_header(str('Content-Type'), str('application/zip')) 
request2.get_method = lambda: str('PUT') 
url2 = opener.open(request2) 

업데이트을 : This q/a 당신에게 도움이 될 수도 그냥 사용 '해달라고 왜

+0

이것은 완벽하게 작동했습니다! 고맙습니다. – SudoKill