表单数据post默认为application/x-www-form-urlencode,可以为<form>标签加入属性enctype=multipart/form-data,使得post的数据按multipart/form-data编码,这种格式通常用于文件上传,二进制传输,但是普通表单数据也可以使用multipart/form-data。
python处理multipart/form-data的其中一个模块是poster,大体使用方法如下:
导入模块中的相关函数
from poster.encode import multipart_encode,MultipartParam
from poster.streaminghttp import register_openers首先,用register_openers()把http流处理器绑定到urllib2上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)生成了带有cookie的urllib2,register_openers()会把urllib2刷新,所以需要重新绑定cookie的处理器(我自己的理解,不对的地方,请指正)
opener.add_handler(urllib2.HTTPCookieProcessor(cj))对于不带文件上传的纯表单数据,把name和value组成一个dict,比如params,接下来用
datagen, headers = multipart_encode(params)datagen是一个生成器,headers是请求头,现在携带了content-length和content-type,content-type包含类型multipart/form-data和随机生成boundary用于分割post的数据块。
再为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。
本文介绍了如何在Python中处理multipart/form-data类型的表单数据,这种格式常用于文件上传和二进制传输。通过使用poster模块,可以方便地构造并发送此类POST请求。
698

被折叠的 条评论
为什么被折叠?



