Python 上传二进制文件。编码问题

Python 上传二进制文件。编码问题,python,encoding,urllib2,Python,Encoding,Urllib2,我想使用urllib2将包含二进制数据的文件发送到服务器: def encode_multipart_formdata(fields, files): LIMIT = '----------lImIt_of_THE_fIle_eW_$' CRLF = '\r\n' L = [] for (key, value) in fields: L.append('--' + LIMIT) L.append('Content-Dispositi

我想使用urllib2将包含二进制数据的文件发送到服务器:

def encode_multipart_formdata(fields, files):
    LIMIT = '----------lImIt_of_THE_fIle_eW_$'
    CRLF = '\r\n'
    L = []
    for (key, value) in fields:
        L.append('--' + LIMIT)
        L.append('Content-Disposition: form-data; name="%s"' % key)
        L.append('')
        L.append(str(value))
    for (key, filename, value) in files:
        L.append('--' + LIMIT)
        L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key,    str(filename)))
        L.append('Content-Type: %s' % get_content_type(filename))
        L.append('')
        L.append(value)
    L.append('--' + LIMIT + '--')
    L.append('')
    body = CRLF.join(L)
    content_type = 'multipart/form-data; boundary=%s' % LIMIT
    return content_type, body
使用:

    f = open(filePath, "rb")
    content_type, body = encode_multipart_formdata([("param1",self.param1)], [("myfile", self.name, f.read())])
    request = urllib2.Request(url, body)
    request.add_header('Content-type', content_type)
    request.add_header('Content-length', str(len(body)))
    response =  urllib2.urlopen(request)
如果文件仅包含ascii符号,则所有符号都可以。但若文件包含二进制数据,则在最后一个代码字符串中出现错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0x9a in position 271: ordinal not in range(128)

如何编码身体?服务器上的文件必须与客户端上的文件相同。错误表明您混合了Unicode数据和字节字符串


您的文件数据仅由字节字符串组成,这意味着您的其他POST值(字段中的键和值)或文件名使用unicode值。首先将所有这些值编码为字节字符串。

若这是您的选项,则使用将更容易完成此任务。呵呵。我开始用
urllib2
解决我的任务,并想用这个库来完成它。但是可能需要尝试和
请求
我使用调试器检查
encode\u multipart\u formdata
的结果是否为字节字符串。问题在于
urllib2
中的代码,它将unicode消息和我的字符串连接在一起body@user1173794:那么您的下一站应该是查看传递给
urllib2
的标题。库本身永远不会使用Unicode。您可能希望共享完整的回溯,以便我们能够帮助诊断。我调试所有代码并找到url,我将其传递给请求的url是unicode。这是我的错误。