2011-10-17 105 views
2

我需要上传一个图像文件,并根据人们的建议使用MultipartPostHandler.py。 但仍然无法正常工作。 这里是我的代码:python可以将图像文件读取为二进制文件

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) 

这个问题他很害怕我,请帮助我! thx。

+0

它试图将二进制数据追加到一个字符串,但Python是试图解释二进制数据作为字符串,并且只允许字符串中有效的ASCII字符(值为0-127的字节)。不幸的是,我不知道如何将二进制数据附加到Python中的字符串,或者我会写一个答案而不是评论。 –

+0

啊哈,谢谢。 –

+0

base64编码允许二进制数据的可打印表示。我对这个标准并不确定,但尝试一下这样的编码并不会有什么坏处。 – krs1

回答

1

我用道格·海尔曼的MultiPartForm类从他的博客将文件上传到我们的邮件服务器成功地:http://pymotw.com/2/urllib2/index.html#module-urllib2

希望你可以使用为好。

+0

是的,我也可以上传文本类型文件,但不是图像文件。 –

+0

奇怪。我可以使用该脚本上传我想要的任何文件。 –

0

i think this can save me. aha.

# convert every byte of data to the corresponding 2-digit hexadecimal

enter code here hex_str = STR(binascii.hexlify(数据))`

# now create a list of 2-digit hexadecimals

hex_list = []

bin_list = []

for ix in range(2, len(hex_str)-1, 2):

hex = hex_str[ix]+hex_str[ix+1] 

    hex_list.append(hex) 

    bin_list.append(bin(int(hex, 16))[2:]) 

#print(bin_list)

bin_str = "".join(bin_list)

print(bin_str)