【问题标题】:python can read image file to binarypython可以将图像文件读取为二进制
【发布时间】: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 作为缓冲区。

标签: python image binary


【解决方案1】:

我使用 Doug Hellman 博客中的 MultiPartForm 类成功地将文件上传到我们的邮件服务器:http://pymotw.com/2/urllib2/index.html#module-urllib2

希望你也可以使用它。

【讨论】:

  • 很奇怪。我可以使用该脚本上传任何我想要的文件。
【解决方案2】:

i think this can save me. aha.

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

enter code herehex_str = str(binascii.hexlify(data))`

# 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)

【讨论】:

    猜你喜欢
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2012-02-01
    相关资源
    最近更新 更多