您的位置:首页 > 编程语言 > Python开发

python post content-type:multipart/form-data 类型的表单数据

2016-01-10 11:21 2071 查看
表单数据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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: