ac7048d1c5bed2dac2e8c5f305de41f4.png

web文件管理器有很多,基于asp、php等语言,由于需要经常从电脑上下载文件,没有其他ftp、php环境,只安装了python,于是用tornado写了一个文件管理器。

功能说明:

  • 读取电脑所有盘符下的文件
  • 只有下载功能
  • 文本修改功能待增加

核心代码:

#coding=utf-8
from tornado import web,httpserver,ioloop
import os
import base64
import random
import time,datetime
import tornado.options


tornado.options.define("root", default='')
tornado.options.define("pswd", default='')
tornado.options.pswd = ''
tornado.options.pwd = '123'
tornado.options.html = '''<html>
<head>
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, width=device-width" />
 <style type="text/css">
    input {font:11px Verdana;BACKGROUND: #FFFFFF;height: 18px;border: 1px solid #666666;}
 </style>
</head>
<body>
	<form method="POST" action="">
	<span style="font:11px Verdana;">密码: </span><input name="pwd" type="password" size="20">
	<input type="submit" value="登陆">
	</form>
</body>
</html>'''
tornado.options.upload = '''<html>
<head>
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no, width=device-width" />
 <style type="text/css">
    body,table{color:#444444;font-family:PingFangSC-Regular, Helvetica, 'Helvetica Neue', 'Segoe UI', 'Hiragino Sans GB', 'Source Han Sans CN', 'Microsoft YaHei', STHeiti, 'WenQuanYi Micro Hei', sans-serif;font-size:12px;text-align:justify;background-color:#FFFFFF;;word-wrap:break-word;word-break: normal;word-break:break-all;}
#main {
	width: 70%;
	margin: 0 auto;
}
form, table, input, textarea, dl, dt, dd{outline:none}
a{color:#000;text-decoration:none;}
/* 小屏幕CSS*/
@media screen and (max-width:630px){
#main{padding: 2px;height: 400px;width: 100%;margin-top: 0px;margin-right: auto;margin-bottom: 0px;margin-left: auto;}
}
 </style>
</head>
<body>
<div id="main">
<form action="" enctype="multipart/form-data" method="post">
<input type="file" name="Filedata" />
<input type="submit" value="上传" name="submit" />
</form></div>
</body>
</html>'''
def timerandom():
	randomNum = random.randint(100,999)
	date = datetime.datetime.fromtimestamp(time.time())  
	return date.strftime('%Y%m%d%H%M%S') + str(randomNum)    # %H:%M:%S

# 主页
class IndexPageHandler(web.RequestHandler):
	def get(self,name):
		remote_ip = self.request.remote_ip 
		if name == 'logout':
			tornado.options.pswd = ''
			self.redirect('/')
		if tornado.options.pswd !=tornado.options.pwc:
			self.write(tornado.options.html)
		else:
			self.write('Hello world')
	def post(self,*arg,**kwargs):
		arg = self.get_argument('pwc',['a'])
		tornado.options.pswd = arg
		self.redirect('/list')

# 文件上传
class UploadHandler(web.RequestHandler):
    def get(self):
        self.write(tornado.options.upload)

    def post(self, *args, **kwargs):
        file_metas = self.request.files
        self.write(file_metas['Filedata'][0]['filename'])
        # for meta in file_metas:
        meta = file_metas['Filedata'][0]
        file_name = meta['filename']
        file_name = os.path.join(os.getcwd() + os.sep + "file", file_name)
        #print file_name
        with open(file_name,'wb') as up:
            up.write(meta['body'])
        self.redirect('/upload')

# 获取文件列表
def getlist(f):
	if f[-1] == ':' or f[:-1] != os.sep:
		f = f + os.sep
	if os.path.exists(f) == False:
		return 'dir is error'
	files = os.listdir(f)
	t = []
	t2 = []
	for fn in files:
		if os.path.isdir(os.path.join(f,fn)):
			t2.append(fn)
		if os.path.isfile(os.path.join(f,fn)):
			t.append(fn)
	tornado.options.root = f
	fs = os.path.abspath(os.path.join(f, ".."))
	return t,t2,f,fs

#浏览列表
class ViewListHandler(web.RequestHandler): 
	def get(self,*arg,**kwargs):
		if tornado.options.pswd !=tornado.options.pwc:
			self.redirect('/')
		arg = self.get_argument('l',['a'])
		d = self.get_argument('d',os.getcwd())
		flist = getlist(d)
		if arg == '':
			self.write(flist)
		else:
			self.render('list.html',name = flist,path = d)

# 文件下载

class DownloadHandler(web.RequestHandler):
    def get(self):
        filename = self.get_argument('filename')
        print(filename )
        # http头 浏览器自动识别为文件下载
        self.set_header('Content-Type', 'application/octet-stream')
        # 下载时显示的文件名称
        #self.set_header('Content-Disposition', 'attachment; filename=%s'%filename)
        self.set_header('Content-Disposition', ('attachment; filename=%s'%filename).encode('utf-8'))
        filename = tornado.options.root + filename
        buff = 1024 * 1024 * 2
        data = ''
        with open(filename, 'rb') as f:
            while True:
                data = f.read(buff)
                if not data:
                    break
                self.write(data)
        # # 记得有finish哦
        self.finish()

class BaseHandler(web.RequestHandler):
	def get(self):
		#self.write_error(404)
		self.write('该网页不存在!')

	def write_error(self, status_code, **kwargs):
		if status_code == 404:
			#self.render('public/404.html')
			self.write('该网页不存在!')
		elif status_code == 500:
			#self.render('public/500.html')
			self.write('该网页不存在!')
		else:
			#self.write('error:' + str(status_code))
			pass

settings = {
	'template_path':os.path.dirname(__file__)+'/template',
	'static_path': "static",
	'default_handler_class': BaseHandler,
	'debug':True
}

# 路由
application = web.Application([
	(r'/list$',ViewListHandler),
	(r'/upload$',UploadHandler),
	(r'/d$',DownloadHandler),
	(r'/(?P<name>[^/]*?)',IndexPageHandler),
	(r".*", BaseHandler),
	],**settings)

# (r"/(apple-touch-icon.png)", tornado.web.StaticFileHandler, dict(path=settings['static_path'])

if __name__ == '__main__':
	http_server = httpserver.HTTPServer(application)
	# 监听端口
	http_server.listen(8080)
	#print('http://127.0.0.1:8080/')
	ioloop.IOLoop.current().start()

效果如下:

a52cae6f0d57b61917d1d634c538cc50.png
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐