python通过http post的方式上传文件到服务器有多种方式,使用urllib2库,poster库和requests库均可实现。此处由于环境的限制,使用requests库来实现。先上代码,我使用的是python2进行的编写
import requests
import json
f = open("./abc", "rb")
url = 'http://100.11.12.13:8989/upload'
files = {'file' : f }
headers = { "Host" : "100.11.12.13:8989" }
proxy = { 'http' : "192.168.1.156:8012"}
post_data = {}
post_data["name"] = "bob"
data = json.dumps(post_data).encode("utf-8")
r = request.post(url,proxies=proxy,data=data,files=files,headers=headers)
print(r.text)
f.close();
此处主要涉及如下方面
{
"field1" : ("filename1", open("filePath1", "rb")),
"field2" : ("filename2", open("filePath2", "rb"), "image/jpeg"),
"field3" : ("filename3", open("filePath3", "rb"), "image/jpeg", {"refer" : "localhost"})
}
在上面的最简模式中 filename 就是filepath中的文件名。该接口参数字典可以以这种方式,支持同时上传不同key值的多个文件。
proxy = { 'http' : "192.168.1.156:8012"}
该行是设置目的代理为 192.168.1.156的8012端口上的服务,我在这个位置部署了一台windows上的nginx服务器。对上传请求做代理转发。此处的 key值指定的是协议的类型,即使是http,也不限制是80端口,实际上我上述的请求服务器目的端口就不是80端口,对应的需要通过https协议进行上传时,需将key值指定为 https ,同时可能需要设置字段,
verify=False.
location / {
proxy_pass http://$http_host$request_uri;
}
此处应是该版本requests库的实现缺陷,故而需要在headers中再指定,headers = { “Host” : “100.11.12.13:8989” }。才能够再nginx代理转发时完成转发。
http {
...
client_max_body_size 100M;
...
}
client_max_body_size该值默认为1MB,为请求正文的允许大小,判断的是Content-Length字段的值。
参考
http://cn.python-requests.org/zh_CN/latest/user/quickstart.html