User Tools

Site Tools


python:internet

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
Last revisionBoth sides next revision
python:internet [2014/08/08 15:10] – [urllib2.build_opener(replace urlopen) and post with cookies] adminpython:internet [2019/07/23 12:47] – [post multipart form data] admin
Line 371: Line 371:
 language vn language vn
 PHPSESSID 01eg0u7uf5bm3r01h6pnrv3q33 PHPSESSID 01eg0u7uf5bm3r01h6pnrv3q33
 +</code>
 +==== Post multipart form data ====
 +=== post with encode_multipart_formdata ===
 +Post with httplib<code python>
 +import httplib, mimetypes
 +
 +def post_multipart(host, selector, fields, files):
 +    """
 +    Post fields and files to an http host as multipart/form-data.
 +    fields is a sequence of (name, value) elements for regular form fields.
 +    files is a sequence of (name, filename, value) elements for data to be uploaded as files
 +    Return the server's response page.
 +    """
 +    content_type, body = encode_multipart_formdata(fields, files)
 +    h = httplib.HTTP(host)
 +    h.putrequest('POST', selector)
 +    h.putheader('content-type', content_type)
 +    h.putheader('content-length', str(len(body)))
 +    h.endheaders()
 +    h.send(body)
 +    errcode, errmsg, headers = h.getreply()
 +    return h.file.read()
 +
 +def encode_multipart_formdata(fields, files):
 +    """
 +    fields is a sequence of (name, value) elements for regular form fields.
 +    files is a sequence of (name, filename, value) elements for data to be uploaded as files
 +    Return (content_type, body) ready for httplib.HTTP instance
 +    """
 +    BOUNDARY = '----------ThIs_Is_tHe_bouNdaRY_$'
 +    CRLF = '\r\n'
 +    L = []
 +    for (key, value) in fields:
 +        L.append('--' + BOUNDARY)
 +        L.append('Content-Disposition: form-data; name="%s"' % key)
 +        L.append('')
 +        L.append(value)
 +    for (key, filename, value) in files:
 +        L.append('--' + BOUNDARY)
 +        L.append('Content-Disposition: form-data; name="%s"; filename="%s"' % (key, filename))
 +        L.append('Content-Type: %s' % get_content_type(filename))
 +        L.append('')
 +        L.append(value)
 +    L.append('--' + BOUNDARY + '--')
 +    L.append('')
 +    body = CRLF.join(L)
 +    content_type = 'multipart/form-data; boundary=%s' % BOUNDARY
 +    return content_type, body
 +
 +def get_content_type(filename):
 +    return mimetypes.guess_type(filename)[0] or 'application/octet-stream'
 +</code>
 +=== fix encode_multipart_formdata for posting binary file ===
 +<code python>
 +def encode_multipart_formdata(fields, files):
 +    """
 +    fields is a sequence of (name, value) elements for regular form fields.
 +    files is a sequence of (name, filename, value) elements for data to be uploaded as files
 +    Return (content_type, body) ready for httplib.HTTP instance
 +    """    
 +    
 +    buf = StringIO()
 +    boundary = mimetools.choose_boundary()            
 +    for (key, value) in fields:
 +        buf.write('--%s\r\n' % boundary)
 +        buf.write('Content-Disposition: form-data; name="%s"' % key)
 +        buf.write('\r\n\r\n' + value + '\r\n')
 +    for (key, filename, value) in files:
 +        contenttype = mimetypes.guess_type(filename)[0] or 'application/octet-stream'
 +        buf.write('--%s\r\n' % boundary)
 +        buf.write('Content-Disposition: form-data; name="%s"; filename="%s"\r\n' % (key, filename))
 +        buf.write('Content-Type: %s\r\n' % contenttype)
 +        buf.write('\r\n' + value + '\r\n')
 +    buf.write('--' + boundary + '--\r\n\r\n')
 +    buf = buf.getvalue()
 +    content_type = 'multipart/form-data; boundary=%s' % boundary
 +    return content_type, buf
 +</code>
 +=== Post using MultipartPostHandler ===
 +  * Install:<code bash>
 +pip install MultipartPostHandler
 +</code>
 +  * example:<code python>
 +import MultipartPostHandler, urllib2, cookielib
 +
 +cookies = cookielib.CookieJar()
 +opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookies),
 +                                MultipartPostHandler.MultipartPostHandler)
 +params = { "username" : "bob", "password" : "riviera",
 +           "file" : open("filename", "rb") }
 +opener.open("http://wwww.bobsite.com/upload/", params)
 </code> </code>
 ===== twisted internet ===== ===== twisted internet =====
python/internet.txt · Last modified: 2022/10/29 16:15 by 127.0.0.1