2013-06-26 2 views
2

Когда я пытаюсь отправить изображение с urllib2, возникает исключение UnicodeDecodeError.POST двоичные данные с использованием httplib вызывают исключения Unicode

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() 

Traceback:

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) 

Если вы не установите заголовок Content-Length, он будет автоматически установлен размер data

Как к вашей ошибки: это происходит на линии

msg += message_body 

Эта ошибка может произойти только, если один из этих двух строк является unicode, а другой str содержащий \xff, как в го в случае, если последний будет автоматически записан в unicode с использованием sys.getdefaultencoding().

Мое окончательное предположение было бы: message_body вот ваш data, который является str и содержит \xff где-то. msg - это то, что было ранее передано HTTPConnection, а именно заголовки, и они являются unicode, потому что вы либо использовали unicode для хотя бы одного ключа в своих заголовках (значения сначала преобразуются в str), либо вы импортировали unicode_literals из __futures__.

+0

большое спасибо, я избежать исключения Юникода подобное: запрос = urllib2.Request (url.encode ("utf-8"), data = binary, headers = headers) Это чистый способ решить проблему? – anasdox

+0

просто не использовать unicode для заголовков или 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