File Uploading, 100% Python
I was trying to mix Perl and Python to achieve file uploading anywhere. After digging into the details of the BaseHTTPServer, I managed to craft out a 100% Python implementation.
Together with my downloading server, I am now able to transfer files with ease in my current 'restricted' environment.
#! /usr/bin/python
import BaseHTTPServer
import os, cgi, re, random, platform
class GetHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
message = '<title>Upload</title>\
<form action=/ method=POST ENCTYPE=multipart/form-data>\
<input type=file name=upfile> <input type=submit value=Upload>\
</form></body></html>'
self.send_response(200)
self.end_headers()
self.wfile.write(message)
return
def do_POST(self):
form = cgi.FieldStorage(fp=self.rfile, headers=self.headers, \
environ={'REQUEST_METHOD':'POST', 'CONTENT_TYPE':self.headers['Content-Type'], })
upfile = form['upfile']
# extract basename of input filename, remove non-alphanumeric characters
if '\\' in upfile.filename:
filename = upfile.filename.split('\\')[-1]
else:
filename = upfile.filename.split('/')[-1]
filename = re.sub('[ \t]','-', filename)
filename = re.sub('[^a-zA-Z0-9_.:-]','', filename)
fp = open(filename, 'wb')
while True:
chunk = upfile.file.read(8192)
if len(chunk) == 0:
break
else:
fp.write(chunk)
fp.close()
self.send_response(200)
self.end_headers()
self.wfile.write('<html><head><title>Upload</title></head><body>\
<h1>Successfully uploaded</h1><br>From: %s<br>To: %s</body></html>' % \
(upfile.filename, os.sep.join([os.getcwd(), filename])) )
if __name__ == '__main__':
try:
port = random.randint(50000,60000)
url = "http://%s:%d/" % (platform.node(), port)
server = BaseHTTPServer.HTTPServer( ('', port), GetHandler )
print "Ask user to visit this URL:\n\t%s" % url
server.serve_forever()
except KeyboardInterrupt:
pass
Labels: python

0 Comments:
Post a Comment
<< Home