python 模拟表单上传文件
2013-03-01 16:16
281 查看
转载: http://oldj.net/article/python-upload-file-via-form-post/
最近要用 Python 模拟表单上传文件,搜索了一下常见的解决方案。
如果只是要模拟提交一个不包含文件字段的表单,实现起来是很简单的,但涉及到文件上传就有一点小复杂,需要自己对文件进行编码,或者使用第三方模块。
如果机器上有 PycURL,那么可以使用 PycURL 来上传文件。不过, PycURL 需要用到 curl;
比如
这儿 的 2 楼有人贴出了一个将文件进行编码之后再 POST 的方法,另外还有
MultipartPostHandler、urllib2_file、poster 等第三方模块。但 MultipartPostHandler 这个模块似乎比较老了,urllib2_file 我试用了一下遇到错误没有成功,这儿我想介绍的是另外一个第三方模块
poster。
如果机器上安装了 Python 的
setuptools,可以通过下面的命令来安装 poster:
装完之后,就可以像下面这样上传文件了:
很简单,文件就上传完成了。
其中那个 register_openers() 相当于以下操作:
另外,poster 也可以携带 cookie,比如:
这样,通过表单 POST 的方式上传文件就方便多了。
最近要用 Python 模拟表单上传文件,搜索了一下常见的解决方案。
如果只是要模拟提交一个不包含文件字段的表单,实现起来是很简单的,但涉及到文件上传就有一点小复杂,需要自己对文件进行编码,或者使用第三方模块。
如果机器上有 PycURL,那么可以使用 PycURL 来上传文件。不过, PycURL 需要用到 curl;
比如
这儿 的 2 楼有人贴出了一个将文件进行编码之后再 POST 的方法,另外还有
MultipartPostHandler、urllib2_file、poster 等第三方模块。但 MultipartPostHandler 这个模块似乎比较老了,urllib2_file 我试用了一下遇到错误没有成功,这儿我想介绍的是另外一个第三方模块
poster。
如果机器上安装了 Python 的
setuptools,可以通过下面的命令来安装 poster:
from poster.encode import multipart_encode from poster.streaminghttp import register_openers import urllib2 # 在 urllib2 上注册 http 流处理句柄 register_openers() # 开始对文件 "DSC0001.jpg" 的 multiart/form-data 编码 # "image1" 是参数的名字,一般通过 HTML 中的 <input> 标签的 name 参数设置 # headers 包含必须的 Content-Type 和 Content-Length # datagen 是一个生成器对象,返回编码过后的参数 datagen, headers = multipart_encode({"image1": open("DSC0001.jpg", "rb")}) # 创建请求对象 request = urllib2.Request("http://localhost:5000/upload_image", datagen, headers) # 实际执行请求并取得返回 print urllib2.urlopen(request).read()
很简单,文件就上传完成了。
其中那个 register_openers() 相当于以下操作:
from poster.encode import multipart_encode from poster.streaminghttp import StreamingHTTPHandler, StreamingHTTPRedirectHandler, StreamingHTTPSHandler handlers = [StreamingHTTPHandler, StreamingHTTPRedirectHandler, StreamingHTTPSHandler] opener = urllib2.build_opener(*handlers) urllib2.install_opener(opener)
另外,poster 也可以携带 cookie,比如:
opener = poster.streaminghttp.register_openers() opener.add_handler(urllib2.HTTPCookieProcessor(cookielib.CookieJar())) params = {'file': open("test.txt", "rb"), 'name': 'upload test'} datagen, headers = poster.encode.multipart_encode(params) request = urllib2.Request(upload_url, datagen, headers) result = urllib2.urlopen(request)
这样,通过表单 POST 的方式上传文件就方便多了。
相关文章推荐
- python 模拟表单上传文件
- python_模拟表单上传文件
- 使用python模拟post表单上传文件
- 使用httpclient模拟表单上传文件,后台用struts2接收
- c# 模拟提交带文件上传的表单
- HttpClient(五)-- 模拟表单上传文件
- Python模拟HTTP Post上传文件
- C#模拟form表单提交数据,上传文件
- 利用socket模拟http的混合表单上传(在一个请求中提交表单并上传多个文件)
- Servlet实现文件上传到服务器(不用表单,直接用代码模拟表单提交)
- asp.net 模拟提交有文件上传的表单(通过http模拟上传文件)
- c# 模拟表单提交,post form 上传文件、大数据内容
- Java模拟表单文件上传(微信/中文名乱码问题)
- HttpClient4.5.2模拟表单post提交上传文件
- java客户端模拟表单上传文件
- From表单——模拟“伪”异步上传文件
- 模拟HTML表单上传文件(RFC 1867)
- 使用Javascript XMLHttpRequest模拟表单(Form)提交上传文件
- 模拟提交有文件上传的表单(通过http模拟上传文件)
- 代码模拟带文件上传的表单