3

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

誰でもこれに対する解決策を知っていますか?

4

1 に答える 1

3

ヘッダーとコンテンツを含む本文を送信しようとしています。コンテンツ タイプとコンテンツの長さを送信する場合は、本文ではなくヘッダーで行う必要があります。

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

Content-Length ヘッダーを設定しない場合、自動的に次のサイズに設定されます。data

あなたのエラーに関して:それはライン上で起こっています

msg += message_body

このエラーは、これら 2 つの文字列の 1 つが で、もう 1 つが を含む場合にのみ発生しますunicodestrこの\xff場合、後者は を使用して Unicode に自動的に変換されsys.getdefaultencoding()ます。

私の最終的な推測は次のとおりmessage_bodyです。は、以前に HTTPConnection に渡されたもの、つまりヘッダーであり、ヘッダーの少なくとも 1 つのキーに Unicode を使用したか (値は以前に変換されています)、またはからインポートしたため、Unicode です。datastr\xffmsgstrunicode_literals__futures__

于 2013-06-27T09:31:37.827 に答える