Created
May 26, 2014 07:53
-
-
Save oneyoung/c7defbe22bed546ae6be to your computer and use it in GitHub Desktop.
POST file using built-in library.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# stolen from http://code.activestate.com/recipes/146306/ | |
import httplib | |
import mimetypes | |
import urlparse | |
def posturl(url, fields, files): | |
urlparts = urlparse.urlsplit(url) | |
return post_multipart(urlparts[1], urlparts[2], fields, files) | |
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('') | |
# add s.decode('string_escape') to avoid ascii decode error | |
body = CRLF.join([s.decode('string_escape') for s in 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' |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment