android开发模仿文件管理器_基于tornado开发的web文件管理器
web文件管理器有很多,基于asp、php等语言,由于需要经常从电脑上下载文件,没有其他ftp、php环境,只安装了python,于是用tornado写了一个文件管理器。功能说明:读取电脑所有盘符下的文件只有下载功能文本修改功能待增加核心代码:#coding=utf-8from tornado import web,httpserver,ioloopimport osimport base6...
·

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()
效果如下:

更多推荐
所有评论(0)