Бинарные данные POST с использованием httplib вызывают исключения из Unicode

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

Тело сообщения HTTP:

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 

версия python 2.7.5

Кто-нибудь знает это решение?

  • Многопоточность для более быстрой загрузки
  • Многопроцессорность бесполезна с urllib2?
  • Как отправить запрос POST с помощью django?
  • Как отправить запрос HTTP / 1.0 через urllib2?
  • Использование urllib2 через прокси-сервер
  • urllib2.urlopen будет висеть навсегда, несмотря на таймаут
  • Урлобин Urllib на некоторых сайтах (например, StackApps api): возвращает результаты мусора
  • Python urllib2 возвращает пустую строку
  • One Solution collect form web for “Бинарные данные POST с использованием httplib вызывают исключения из Unicode”

    Вы пытаетесь отправить тело, содержащее заголовки и контент. Если вы хотите отправить тип контента и длину контента, вам нужно сделать это в заголовках, а не в теле:

     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__ .

    Python - лучший язык программирования в мире.