如果机器上有 PycURL,那么可以使用 PycURL 来上传文件。
不过,由于 PycURL 需要用到 curl,在 Windows 下安装可能会有点麻烦,除 PycURL 外,也有一些其它实现 POST 文件上传的方式,比如 这儿 的 2 楼有人贴出了一个将文件进行编码之后再 POST 的方法,另外还有MultipartPostHandler、urllib2_file、poster 等第三方模块。但 MultipartPostHandler 这个模块似乎比较老了,urllib2_file 我试用了一下遇到错误没有成功,这儿我想介绍的是另外一个第三方模块 poster。
如果机器上安装了 Python 的 setuptools,可以通过下面的命令来安装 poster:
1
|
easy_install
poster
|
装完之后,就可以像下面这样上传文件了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# 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() 相当于以下操作:
1
2
3
4
5
6
|
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,比如:
1
2
3
4
5
6
7
|
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/