20 Enables the use of multipart/form-data for posting forms
23 Upload files
in python:
24 http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306
26 Fabien Seisen: <fabien
@seisen.org>
29 import MultipartPostHandler, urllib2, cookielib
31 cookies = cookielib.CookieJar()
32 opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),
34 params = {
"username" :
"bob",
"password" :
"riviera",
35 "file" : open(
"filename",
"rb") }
36 opener.open(
"http://wwww.bobsite.com/upload/", params)
39 The main function of this file
is a sample which downloads a page
and
40 then uploads it to the W3C validator.
43from builtins import object
44from email.generator import _make_boundary
48from io import StringIO
50IS_PY2 = sys.version_info[0] == 2
53 from urllib2
import BaseHandler, build_opener, HTTPHandler
60 import urllib.parse
as ulib
72 handler_order = HTTPHandler.handler_order - 10
76 if data
is not None and type(data) != str:
80 for(key, value)
in list(data.items()):
82 v_vars.append((key, value))
84 systype, value, traceback = sys.exc_info()
85 raise TypeError(
"not a valid non-string sequence or mapping object", traceback)
88 data = ulib.urlencode(v_vars, doseq)
92 contenttype =
'multipart/form-data; boundary=%s' % boundary
93 if(request.has_header(
'Content-Type')
94 and request.get_header(
'Content-Type').
find(
'multipart/form-data') != 0):
95 print(
"Replacing %s with %s" % (request.get_header(
'content-type'),
'multipart/form-data'))
96 request.add_unredirected_header(
'Content-Type', contenttype)
98 request.data = bytearray(data,
'latin1')
104 boundary = _make_boundary(os.getuid + os.getpid())
107 for(key, value)
in these_vars:
108 buf.write(
'--%s\r\n' % boundary)
109 buf.write(
'Content-Disposition: form-data; name="%s"' % key)
110 buf.write(
'\r\n\r\n' + value +
'\r\n')
111 for(key, fd)
in files:
112 file_size = os.fstat(fd.fileno())[stat.ST_SIZE]
113 filename = fd.name.split(
'/')[-1]
114 contenttype = mimetypes.guess_type(filename)[0]
or 'application/octet-stream'
115 buf.write(
'--%s\r\n' % boundary)
116 buf.write(
'Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename))
117 buf.write(
'Content-Type: %s\r\n' % contenttype)
120 buf.write(
'\r\n' + fd.read() +
'\r\n')
121 buf.write(
'--' + boundary +
'--\r\n\r\n')
126 https_request = http_request
131 validatorURL =
"http://validator.w3.org/check"
132 opener = build_opener(MultipartPostHandler)
134 def validateFile(url):
135 temp = tempfile.mkstemp(suffix=
".html")
136 os.write(temp[0], opener.open(url).
read())
137 params = {
"ss" :
"0",
138 "doctype" :
"Inline",
139 "uploaded_file" : open(temp[1],
"rb") }
140 print(opener.open(validatorURL, params).
read())
143 if len(sys.argv[1:]) > 0:
144 for arg
in sys.argv[1:]:
147 validateFile(
"http://www.google.com")
149if __name__==
"__main__":
def __init__(self, anycallable)
def multipart_encode(self, these_vars, files, boundary=None, buf=None)
def http_request(self, request)
static pid_list_t::iterator find(const PIDInfoMap &map, pid_list_t &list, pid_list_t::iterator begin, pid_list_t::iterator end, bool find_open)
def read(device=None, features=[])