一般linux环境下都有python2.7,所以,本文以python2.7环境为基础,编写上传下载服务
使用下面的命令即可运行该脚本,监听8000端口
python2.7 ./updown.py 8000
脚本内容如下
#!/bin/env python2
# coding=utf-8
import os
import cgi
import sys
import urllib
import urlparse
import platform
from BaseHTTPServer import HTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
upload_page = '''
Upload
'''
directory_page = '''
Download List
'''
class PostHandler(SimpleHTTPRequestHandler):
def do_GET(self):
if self.path == '/':
self.send_response(200)
self.send_header("Content-type", "text/html;charset=utf-8")
self.end_headers()
self.wfile.write(upload_page)
return
path = self.translate_path(self.path[5:])
parts = urlparse.urlsplit(self.path)
if parts.path.endswith('/'):
try:
curr_dir = os.listdir(path)
except os.error:
self.send_error(404, "No permission to list directory")
return
curr_dir.sort(key=lambda a: a.lower())
href_list = list()
href_li = '
%s'
for name in curr_dir:
if platform.system().lower() == 'windows':
name = name.decode('gbk').encode('utf-8')
fullname = os.path.join(path, name)
if os.path.isdir(fullname):
href_list.append(href_li % (urllib.quote(name + '/'), cgi.escape(name + '/')))
elif os.path.islink(fullname):
href_list.append(href_li % (urllib.quote(name + '@'), cgi.escape(name)))
else:
href_list.append(href_li % (urllib.quote(name), cgi.escape(name)))
self.send_response(200)
self.send_header("Content-type", "text/html;charset=utf-8")
self.end_headers()
self.wfile.write(directory_page.replace('__LIST__', ''.join(href_list)))
return
if not os.path.isdir(path):
try:
if platform.system().lower() == 'windows':
path = path.decode('utf-8').encode('gbk')
with open(path, 'rb') as f:
fs = os.fstat(f.fileno())
self.send_response(200)
self.send_header("Content-type", "application/force-download")
self.send_header("Content-Length", str(fs[6]))
self.send_header("Last-Modified", self.date_time_string(fs.st_mtime))
self.end_headers()
self.copyfile(f, self.wfile)
return
except IOError, e:
self.send_error(404, "File not found: " + str(e))
return
self.send_response(301)
new_parts = (parts[0], parts[1], parts[2] + '/', parts[3], parts[4])
new_url = urlparse.urlunsplit(new_parts)
self.send_header("Location", new_url)
self.end_headers()
def do_POST(self):
form = cgi.FieldStorage(
fp=self.rfile,
headers=self.headers,
environ={'REQUEST_METHOD': 'POST', 'CONTENT_TYPE': 'multipart/form-data'}
)
self.send_response(200)
self.send_header("Content-type", "text/html;charset=utf-8")
self.end_headers()
if form['file'].filename:
with open('./' + os.path.basename(form['file'].filename), 'wb') as f:
f.write(form['file'].file.read())
if __name__ == '__main__':
if sys.argv[1:]:
port = int(sys.argv[1])
else:
port = 8000
server_address = ('', port)
PostHandler.protocol_version = "HTTP/1.0"
httpd = HTTPServer(server_address, PostHandler)
sa = httpd.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
httpd.serve_forever()