59 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			59 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
import httplib, mimetypes
 | 
						|
 | 
						|
"""Copied from the cookbook 
 | 
						|
 | 
						|
    see ActiveState's ASPN 
 | 
						|
    http://aspn.activestate.com/ASPN/Cookbook/Python/Recipe/146306
 | 
						|
"""
 | 
						|
 | 
						|
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'
 |