2011-10-17 14 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) 

このprobl私をたくさん溺れさせてください、私を助けてください! thx。

+0

バイナリデータを文字列に追加しようとしているが、Pythonは文字列としてそのバイナリデータを解釈しようとしている、とだけさ文字列内の有効なASCII文字(0〜127の値を持つバイト)を許可します。残念ながら、私はバイナリデータをPythonの文字列に追加する方法を知らないか、コメントの代わりに答えを書いていました。 –

+0

aha、ありがとうございます。 –

+0

base64エンコーディングは、バイナリデータの印刷可能な表現を可能にします。私は標準についてはわかりませんが、そのようなエンコーディングを試すのは害ではありません。 – krs1

答えて

1

私はsucessfully当社のメールサーバーにファイルをアップロードするために彼のブログからダグ・ヘルマンの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)

関連する問題