FLASK的上传、下载比较简单我,我之前留了博客记录并写了个类似网盘的东西,昨天突然想把网盘搞个验证,于是留下了这篇记录。
因为,我这个已经部署在阿里云服务器上了,所以张贴代码的时候不会进行优化和重构,反正代码这东西既然能用,有时候真的不想仔细看,所以本次主要记录思路和思考点以及注意项,代码码就是意思意思凑合凑合。
首先,网盘建立公有网盘是比较简单的一个HTML,文件名UPLOAD.HTML ,3个路由基本拿下
<html>
<head>
<title>海的思想个人简易网盘</title>
</head>
<body>
<p><h1>这里是公共网盘</h1></p>
{%if phone_s %}
<p><h1>用户:{{phone_s}}你好</h1></p>
<p><h1><a href="wangpan2/{{phone_s}}">进入私人网盘请点击这里</a></h1></p>
{%else%}
<h1><a href="/login">如需私人网盘,请先登录</a></h1>
{%endif%}
<form action="/uploader" method="POST" enctype="multipart/form-data">
<input type="file" name="file" accept=".jpg,.png,.xls,.doc,.xlsx" />
<input type="submit" />
</form>
{%for i in a %}
<p><a href="/down/{{i}}">{{i}}</a></p>
{%endfor%}
</body>
</html>
这个HTML页面承载着方面
- 通过判断SESSION的手机号内容语句,来决定是否展示私人网盘的地址
- 通过get方法的表单提供上传选择按钮
- 通过GET方法展示公共目录下的文件(注意:他的路由里边我写了判断是文件夹还是文件的相关逻辑)
- 通过POST方法提交文件,这里注意下ACTION 的呼叫路由就行
然后是配套的路由
from flask import Blueprint,redirect,request,render_template,send_file,session,g
import os
wangpan_bp=Blueprint('wanpan',__name__)
@wangpan_bp.before_request
def session_phone():
phone = session.get('phone')
if phone :
g.phone =phone
else:
g.phone = ''
@wangpan_bp.route('/wangpan')
def wangpan():
a=[]
for i in os.listdir('./upload/'):
if os.path.isfile('./upload/'+i):
a.append(i)
print(a)
phone_s=session.get('phone')
return render_template('upload.html',a=a,phone_s=phone_s)
@wangpan_bp.route('/uploader', methods = ['GET', 'POST'])
def uploader():
if request.method == 'POST':
f = request.files['file']
f.save(r'./upload/%s'%f.filename)
return redirect ('/wangpan')
@wangpan_bp.route('/down/<name>')
def down(name):
return send_file(r'./upload/%s'%name,as_attachment=True)
下面是私人网盘部分 ,先是HTML文件名UPLOAD2.HTML部分。
<html>
<head>
<title>海的思想个人简易网盘</title>
</head>
<body>
<p><h1>这里是私人网盘</h1></p>
{%if phone_s %}
<p><h1>用户:{{phone_s}}你好</h1></p>
{%endif%}
<form action="/uploader2" method="POST" enctype="multipart/form-data">
<input type="file" name="file" accept=".jpg,.png,.xls,.doc,.xlsx" />
<input type="submit" />
</form>
{%for i in a %}
<p><a href="/down2/{{i}}">{{i}}</a></p>
{%endfor%}
</body>
</html>
这个页面很类似,不同在于,按理说能进入私人网盘的人应该是通过了用户验证的,所以用户必然是有账号的,那么,我们获取用户账号,并在该账号的子文件夹内部执行展示文件、上传、下载内容。那么就是把用户特征传过来并把指向写好
下面是代码部分,接着上面的路由代码写的
@wangpan_bp.route('/wangpan2/<phone>')
def wangpan2(phone):
if g.phone==phone:
a=os.listdir('./upload/'+phone)
return render_template('upload2.html',a=a,phone_s=phone)
else:
return '请去登录'
@wangpan_bp.route('/uploader2', methods = ['GET', 'POST'])
def uploader2():
if request.method == 'POST':
phone = g.phone
f = request.files['file']
f.save(r'./upload/%s/%s'%(phone,f.filename))
return redirect ('/wangpan2/%s'%phone)
@wangpan_bp.route('/down2/<name>')
def down2(name):
print('g is ',g.phone)
return send_file(r'./upload/%s/%s'%(g.phone,name),as_attachment=True)
以上内容之外还要补充一个注册、登录内容,注册内容务必在注册的时候给用户成功用户单独建立一个标识文件夹,因为手机号唯一所以,不用怎么做冲突校验。
def login_user():
u1 = User()
if request.method=='POST':
ph=request.form.get('phone')
pd=request.form.get('password')
rpd=request.form.get('repassword')
if pd==rpd:
if User.query.filter(User.phone == ph).first() :
pass
else:
u1.phone = ph
u1.password=pd
u1.username='test'
db.session.add(u1)
db.session.commit()
os.mkdir('./upload/%s'%ph)
return '注册新用户完毕,返回输入手机号登录'
return render_template('jiaban2.html',u1=u1.query.all())
@user_bp.route('/login_ok',methods=['POST','GET'])
def login_ok():
u1 = User()
if request.method=='POST':
ph=request.form.get('phone')
pd=request.form.get('password')
user_0=User.query.filter(User.phone == ph).first()
if user_0 :
if user_0.password==pd :
session['phone']=user_0.phone
return redirect('/wangpan')
else:
return '用户名或密码错误'
else:
return '用户名或密码错误'
登录页面 ,随便一贴得了
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8">
<title></title>
</head>
<body>
<form action="login" method="POST" style="text-align: center" >
<h1>查询员工编码</h1> <input type="text" placeholder="员工编码" name="staff_code">
<br>
<input type="submit" value="查询">
</form>
<br>
<br>
<form action="login_user" method="POST" style="text-align: center" >
<h1>注册新用户</h1> <p><input type="text" placeholder="手机号" name="phone"></p>
<p><input type="text" placeholder="密码" name="password"></p>
<p><input type="text" placeholder="重输密码" name="repassword"></p>
<br>
<input type="submit" value="注册">
</form>
{%if phone_s %}
<h1>用户:{{phone_s}}你好,登录成功</h1>
{%else%}
<form action="login_ok" method="POST" style="text-align: center" >
<h1>已注册用户登录</h1> <p><input type="text" placeholder="手机号" name="phone"></p>
<p><input type="text" placeholder="密码" name="password"></p>
<br>
<input type="submit" value="登录">
{%endif%}
</form>
</body>
</html>
效果如下:
丑爆了。。。但是~它能用,速度很快而且很好用,不正规,但是自己用,朋友用,也还行,凑合用也马马虎虎。好歹也是有验证的私人网盘,小公司用用也不是不可以,不像微信群里传个文件后期找还要翻几个月聊天记录。
|