2013-06-26 3 views
2

urllib2로 이미지를 보내려고하면 UnicodeDecodeError 예외가 발생합니다.httplib를 사용하는 POST 바이너리 데이터로 인해 유니 코드 예외가 발생합니다.

HTTP POST 본문 :

f = open(imagepath, "rb") 
binary = f.read() 
mimetype, devnull = mimetypes.guess_type(urllib.pathname2url(imagepath)) 

body = """Content-Length: {size} 
Content-Type: {mimetype} 

{binary} 
""".format(size=os.path.getsize(imagepath), 
      mimetype=mimetype, 
      binary=binary) 

request = urllib2.Request(url, body, headers) 
opener = urllib2.build_opener(urllib2.HTTPSHandler(debuglevel=1)) 
response = opener.open(request) 
print response.read() 

가 역 추적 :

response = opener.open(request) 
    File "/usr/local/lib/python2.7/urllib2.py", line 404, in open 
    response = self._open(req, data) 
    File "/usr/local/lib/python2.7/urllib2.py", line 422, in _open 
    '_open', req) 
    File "/usr/local/lib/python2.7/urllib2.py", line 382, in _call_chain 
    result = func(*args) 
    File "/usr/local/lib/python2.7/urllib2.py", line 1222, in https_open 
    return self.do_open(httplib.HTTPSConnection, req) 
    File "/usr/local/lib/python2.7/urllib2.py", line 1181, in do_open 
    h.request(req.get_method(), req.get_selector(), req.data, headers) 
    File "/usr/local/lib/python2.7/httplib.py", line 973, in request 
    self._send_request(method, url, body, headers) 
    File "/usr/local/lib/python2.7/httplib.py", line 1007, in _send_request 
    self.endheaders(body) 
    File "/usr/local/lib/python2.7/httplib.py", line 969, in endheaders 
    self._send_output(message_body) 
    File "/usr/local/lib/python2.7/httplib.py", line 827, in _send_output 
    msg += message_body 
    File "/home/usertmp/biogeek/lib/python2.7/encodings/utf_8.py", line 16, in decode 
    return codecs.utf_8_decode(input, errors, True) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xff in position 49: invalid start byte 

파이썬 버전 2.7.5

사람이에 대한 해결책을 알아?

+0

예외가 발생하는 행을 얻지 못했습니다. –

+0

@PauloBu opener.open (요청) 행에서 예외가 발생합니다. – anasdox

답변

2

헤더와 콘텐츠가 포함 된 본문을 보내려고합니다. 콘텐츠 유형 및 콘텐츠 길이를 보내려면, 당신은하지 본문에, 헤더에서 작업을 수행해야합니다 당신은 콘텐츠 길이 헤더를 설정하지 않은 경우

headers = {'Content-Type': mimetype, 'Content-Length', str(size)} 
request = urllib2.Request(url, data=binary, headers=headers) 

,가 자동으로 설정됩니다 당신의 오류로

data의 크기 :이 라인에 무슨 일이 일어나고

msg += message_body 

이 두 문자열 중 하나가 unicode이고, 다른 str이 일 같이 \xff을 포함하는 경우에만이 오류가 발생할 수 있습니다 이 경우 후자는 sys.getdefaultencoding()을 사용하여 자동으로 유니 코드로 코칭됩니다.

내 마지막 추측은 다음과 같습니다. data 여기는 str이며 어딘가에 \xff이 포함되어 있습니다. msg은 머리글의 HTTPConnection에 전달 된 것으로 유니 코드는 머리글에서 적어도 하나의 키에 유니 코드를 사용하고 (값은 str으로 먼저 변환 됨) 에서 unicode_literals을 가져 왔기 때문에 유니 코드입니다.

+0

대단히 감사드립니다. 그런 유니 코드 예외는 피하십시오 : 요청 = urlib2.Request (url.encode ("utf-8"), data = binary, headers = headers) 이 방법으로 문제를 해결할 수 있습니까? – anasdox

+0

헤더 나 url에 유니 코드를 사용하지 마십시오. URL은 백분율로 인코딩해야하며 헤더는 iso-8859-1이거나 [rfc 2047] (http://tools.ietf.org/html/rfc2047#section-8)에 따라 인코딩되어야합니다. 최선의 충고는 다음과 같습니다. 가능한 경우 [요청] (http://docs.python-requests.org/en/latest/)을 사용하면 유니 코드를 다루는 것이 더 좋습니다. – mata

+0

조언 해 주셔서 감사합니다. – anasdox