【发布时间】:2011-12-09 08:20:31
【问题描述】:
我需要上传一个图像文件,我按照人们的建议使用 MultipartPostHandler.py。 但仍然无法正常工作。 这是我的代码:
params = {"upload", open("12345.jpg", "rb")} // in 'rb'
opener = urllib2.build_opener(MultipartPostHandler)
res = opener.open(url, params)
这是 MultipartPostHander 中的代码:
def multipart_encode(vars, files, boundary = None, buffer = None):
if boundary is None:
boundary = mimetools.choose_boundary()
if buffer is None:
buffer = ''
for(key, value) in vars:
buffer += '--%s\r\n' % boundary
buffer += 'Content-Disposition: form-data; name="%s"' % key
buffer += '\r\n\r\n' + value + '\r\n'
for(key, fd) in files:
file_size = os.fstat(fd.fileno())[stat.ST_SIZE]
filename = fd.name.split('/')[-1]
contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
buffer += '--%s\r\n' % boundary
buffer += 'Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename)
buffer += 'Content-Type: %s\r\n' % contenttype
# buffer += 'Content-Length: %s\r\n' % file_size
fd.seek(0)
buffer += '\r\n' + fd.read() + '\r\n'
buffer += '--%s--\r\n\r\n' % boundary
return boundary, buffer
multipart_encode = Callable(multipart_encode)
https_request = http_request
错误出现在:
buffer += '\r\n' + fd.read() + '\r\n'
错误是:
'ascii' codec can't decode byte 0xff in position 2: ordinal not in range(128)
这个问题困扰了我很多,请帮帮我! 谢谢。
【问题讨论】:
-
它试图将二进制数据附加到字符串中,但 Python 试图将该二进制数据解释为字符串,并且只允许字符串中包含有效的 ASCII 字符(值为 0-127 的字节)。不幸的是,我不知道如何在 Python 中将二进制数据附加到字符串,否则我会写一个答案而不是评论。
-
base64 编码允许二进制数据的可打印表示。我不确定标准,但尝试这样的编码不会有什么坏处。
-
我不确定这是否可行,但也许你可以使用 bytearray 而不是 str 作为缓冲区。