如果机器上有 PycURL,那么可以使用 PycURL 来上传文件。


不过,由于 PycURL 需要用到 curl,在 Windows 下安装可能会有点麻烦,除 PycURL 外,也有一些其它实现 POST 文件上传的方式,比如 这儿 的 2 楼有人贴出了一个将文件进行编码之后再 POST 的方法,另外还有MultipartPostHandler、urllib2_file、poster 等第三方模块。但 MultipartPostHandler 这个模块似乎比较老了,urllib2_file 我试用了一下遇到错误没有成功,这儿我想介绍的是另外一个第三方模块 poster。


如果机器上安装了 Python 的 setuptools,可以通过下面的命令来安装 poster:




easy_install poster


装完之后,就可以像下面这样上传文件了:



# test_client.py
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 )



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