python post上传文件

首先我们先来看看一个上传图片的网页form结构

<form action=”images_upload.php”  method=”post” name=”form_1″ id=”form_1″ enctype=”multipart/form-data” >
<input name=”file” class=”div3″ id=”file” type=”file” onchange=”load_from()” title=”点击更改”>
<button type=”submit” value=”上传”/>
</form>

可以看到action提交表单的地址为images_upload.php,method为post,enctype=”multipart/form-data

由于不知道如何把图片上传,就google了下

发现了如下几个库及方法

Python中使用POST方式上传文件(poster)

http://oldj.net/article/python-upload-file-via-form-post/

using requests post a multipart encoded file(requests)

http://docs.python-requests.org/en/latest/user/quickstart/#post-a-multipart-encoded-file

Python模拟HTTP Post上传文件(urllib2)

http://www.cnblogs.com/chy710/p/3791317.html

打开chrome 查看network 请求信息,发现request payload的一栏信息如下:

——WebKitFormBoundary6W5jJP9OUllB3OgE

Content-Disposition: form-data; name=”file”; filename=”1.jpg”

Content-Type: image/jpeg

 

——WebKitFormBoundary6W5jJP9OUllB3OgE

Content-Disposition: form-data; name=”type”

 

 

img1

——WebKitFormBoundary6W5jJP9OUllB3OgE–

由于对于我要处理的网页1,2两种方法无效,遂尝试第三种方法

把图片的二进制文件放到content-type之后,配好data及headers,请求成功得到响应数据。

实现代码如下:
boundary = '----%s' % hex(int(time.time() * 1000))
data = []
fr=open(your imgDir,'rb')
print fr
data.append('--%s' % boundary)
data.append('Content-Disposition: form-data; name="file"; filename="1.jpg"')
data.append('Content-Type: %s\r\n' % 'image/jpeg')
data.append(fr.read())
fr.close()
data.append('--%s' % boundary)
data.append('Content-Disposition: form-data; name="type"')
data.append('')
data.append('--%s--' % boundary)
http_url='images_upload.php'
http_body='\r\n'.join(data)
try:
#buld http request
req=urllib2.Request(http_url, data=http_body)
req.unverifiable = True
#header
req.add_header('Content-Type', 'multipart/form-data; boundary=%s' % boundary)
req.add_header('User-Agent','Mozilla/4.0 (compatible; MSIE 5.5; Windows NT)')
req.add_header('Referer','somewhere')
req.add_header('Cookie',add your cookie)
#post data to server
resp = urllib2.urlopen(req, timeout=5)
#get response
qrcont=resp.read()
print qrcont

except Exception,e:
print ‘http error’

发表评论

电子邮件地址不会被公开。 必填项已用*标注