使用 urllib3 UnicodeDecodeError 上传文件
file upload using urllib3 UnicodeDecodeError
我正在尝试使用 urllib3 通过多部分表单 POST 请求上传文件。我按照 urllib docs:
中的这个例子
>>> with open('example.txt') as fp:
... file_data = fp.read()
>>> r = http.request(
... 'POST',
... 'http://httpbin.org/post',
... fields={
... 'filefield': ('example.txt', file_data),
... })
>>> json.loads(r.data.decode('utf-8'))['files']
{'filefield': '...'}
当我修改示例代码时,我添加了一些额外的字段,这些字段是我上传到的 API 所需要的:
import urllib3
http = urllib3.PoolManager()
with open('/Volumes/GoogleDrive/My Drive/Code/Fuse-Qu/qu/uploads/risk.pdf') as fp:
file_data = fp.read()
r = http.request(
'POST',
'https://***.fuseuniversal.com/api/v4.2/contents/media?auth_token=***',
fields={
"name": "test api upload 11",
"description": "this is a test of uploading a pdf via the api",
"composite_attributes[type]": "File",
"community_ids": "24827",
"composite_attributes[file]": ('risk.pdf', file_data, 'document/pdf'),
})
但是我最终得到了这个错误:
Traceback (most recent call last):
File "test-urllib.py", line 6, in <module>
file_data = fp.read()
File "/Users/dunc/.pyenv/versions/3.8.1/lib/python3.8/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte
您需要以二进制模式打开文件,因为它不是文本。如果您打开文件时未指定二进制文件,python3 会自动尝试将内容解码为 utf-8。这是更新的失败行:
with open('/Volumes/GoogleDrive/My Drive/Code/Fuse-Qu/qu/uploads/risk.pdf', 'rb') as fp:
file_data = fp.read()
我正在尝试使用 urllib3 通过多部分表单 POST 请求上传文件。我按照 urllib docs:
中的这个例子>>> with open('example.txt') as fp:
... file_data = fp.read()
>>> r = http.request(
... 'POST',
... 'http://httpbin.org/post',
... fields={
... 'filefield': ('example.txt', file_data),
... })
>>> json.loads(r.data.decode('utf-8'))['files']
{'filefield': '...'}
当我修改示例代码时,我添加了一些额外的字段,这些字段是我上传到的 API 所需要的:
import urllib3
http = urllib3.PoolManager()
with open('/Volumes/GoogleDrive/My Drive/Code/Fuse-Qu/qu/uploads/risk.pdf') as fp:
file_data = fp.read()
r = http.request(
'POST',
'https://***.fuseuniversal.com/api/v4.2/contents/media?auth_token=***',
fields={
"name": "test api upload 11",
"description": "this is a test of uploading a pdf via the api",
"composite_attributes[type]": "File",
"community_ids": "24827",
"composite_attributes[file]": ('risk.pdf', file_data, 'document/pdf'),
})
但是我最终得到了这个错误:
Traceback (most recent call last):
File "test-urllib.py", line 6, in <module>
file_data = fp.read()
File "/Users/dunc/.pyenv/versions/3.8.1/lib/python3.8/codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe2 in position 10: invalid continuation byte
您需要以二进制模式打开文件,因为它不是文本。如果您打开文件时未指定二进制文件,python3 会自动尝试将内容解码为 utf-8。这是更新的失败行:
with open('/Volumes/GoogleDrive/My Drive/Code/Fuse-Qu/qu/uploads/risk.pdf', 'rb') as fp:
file_data = fp.read()