python post content-type:multipart/form-dataタイプのフォームデータ
フォームデータpostのデフォルトはアプリケーション/x-www-form-urlencodeで、ラベルに属性enctype=multipart/form-dataを加えることができ、postのデータはmultipart/form-dataで符号化され、このフォーマットは通常ファイルアップロード、バイナリ転送に使用されますが、通常のフォームデータはmultipart/form-dataを使用することもできます.
pythonがmultipart/form-dataを処理するモジュールの1つはposterであり、一般的な使用方法は以下の通りである.
モジュール内の相関関数のインポート
さらにheadersにキー値ペア情報を追加し、リクエストオブジェクトを生成します.
pythonがmultipart/form-dataを処理するモジュールの1つはposterであり、一般的な使用方法は以下の通りである.
モジュール内の相関関数のインポート
from poster.encode import multipart_encode,MultipartParam
from poster.streaminghttp import register_openers
まずregister_Openers()httpストリームプロセッサをurllib 2にバインドopener = poster.streaminghttp.register_openers()
ここで注意して、前に# cookie, cookie
cj = cookielib.LWPCookieJar()
# cookie opener, opener.open() URL
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))
# opener, urllib2.urlopen() cookie
urllib2.install_opener(opener)
クッキー付きurllib 2,register_を生成Openers()はurllib 2をリフレッシュするので、クッキーのプロセッサを再バインドする必要があります(私自身の理解、間違ったところ、指摘してください)opener.add_handler(urllib2.HTTPCookieProcessor(cj))
ファイルなしでアップロードされた純粋なフォームデータについて、nameとvalueをparamsなどのdictに構成し、次にdatagen, headers = multipart_encode(params)
datagenはジェネレータで、headersはリクエストヘッダであり、現在content-lengthとcontent-typeが携帯されている.content-typeには、postを分割するためのタイプmultipart/form-dataとランダム生成boundaryを含むデータブロックが含まれている.さらにheadersにキー値ペア情報を追加し、リクエストオブジェクトを生成します.
req = urllib2.Request(url, datagen, headers)
リクエスト・オブジェクト・アクセスの使用urllib2.urlopen(req)
ファイルをアップロードする場合、私はこのようにします.datagen,headers = multipart_encode({'file':open(path,'rb')})
ここで、nameはfileであり、実際の状況に対応する.また通常のフォームパラメータやファイルがある場合は、dictに直接組み立ててmultipart_を使用することもできると思います.encode、そしてstackoverflowの上の方法はこうですfrom poster.encode import multipart_encode, MultipartParam
import urllib2
def postFileRequest(url, paramName, fileObj, additionalHeaders={}, additionalParams={}):
items = []
#wrap post parameters
for name, value in additionalParams.items():
items.append(MultipartParam(name, value))
#add file
items.append(MultipartParam.from_file(paramName, fileObj))
datagen, headers = multipart_encode(items)
#add headers
for item, value in additionalHeaders.iteritems():
headers[item] = value
return urllib2.Request(url, datagen, headers)
他のパラメータをMultipartParamクラスにカプセル化し、ファイルはMultipart.from_file()を追加し、encodeを行います.テストしたことがないので、参考にしてください.http://stackoverflow.com/questions/10546437/problems-using-multipart-encode-poster-library.公式文書も参照できますhttp://atlee.ca/software/poster/poster.encode.html#poster.encode.MultipartParam.