场景:
- 点击上传文件按钮,选择需要上传的文件后上传
- 文件上传成功后,会将文件保存到指定目录下
- 限制上传文件的格式
- 在前端点击文件后下载
上手
文件上传
app.py
@app.route('/upload', methods=['GET', 'POST'])
def upload_file():
return render_template('upload.html')
app.config['UPLOAD_FOLDER'] = './upload'
file_dir = app.config['UPLOAD_FOLDER']
@app.route('/uploader', methods=['GET', 'POST'])
def uploader():
"""
文件上传
"""
if request.method == 'POST':
f = request.files['file']
f.save(os.path.join(app.config['UPLOAD_FOLDER'], f.filename))
print(request.files, f.filename)
return '文件上传成功!'
else:
return render_template('upload.html')
upload.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传</title>
<style>
a{
text-decoration: none;
color: #2062e0;
}
a:hover{
text-decoration: none;
color: #2062e0;
}
</style>
</head>
<body>
<h1 align="center">TEST</h1>
<div align="center">
{# enctype:属性用于指定将上传文件数据发送给服务器端之前对表单数据进行编码的斱式 #}
{# enctype="multipart/form-data" => 表示不对字符编码。当使用有文件上传控件的表单时,该值是必需的。 #}
<form action="/uploader" method="post" enctype="multipart/form-data">
<br><br><br>
{# accept可以自定以文件上传格式 #}
<input type="file" name="file" accept=".txt, .pdf, .doc, .docx, .md" value="{{ csrf_token }}" />
<br><br><br>
<input type="submit" value="提交" />
</form>
<br><br><br>
</div>
</body>
</html>
文件下载
app.py
@app.route('/download', methods=['GET', 'POST'])
def download():
"""
文件下载
:return:
"""
timelist = []
Foder_Name = []
Files_Name = []
lists = os.listdir(file_dir + '/')
for i in lists:
timelist.append(time.ctime(os.path.getatime(file_dir + '/' + i)))
for k in range(len(lists)):
Files_Name.append(lists[k])
Foder_Name.append(lists[k] + " ~~~~~~~~~~~~~~~~~~~~~ " + timelist[k])
print(file_dir)
return render_template('download.html', allname=Foder_Name, name=Files_Name)
@app.route('/downloads/<path:path>', methods=['GET', 'POST'])
def downloads(path):
"""
重写download方法,根据前端点击的文件传送过来的path,下载文件
send_from_directory:用于下载文件
flask.send_from_directory(所有文件的存储目录,相对于要下载的目录的文件名,as_attachment:设置为True是否要发送带有标题的文件)
:param path:
:return:
"""
return send_from_directory(app.config['UPLOAD_FOLDER'], path, as_attachment=True)
download.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>文件下载</title>
<style>
a{
text-decoration: none;
color: #2062e0;
}
a:hover{
text-decoration: none;
color: #2062e0;
}
</style>
</head>
<body>
<div align="center">
<h1>文件下载</h1><br><br>
{# 输出文件名及文件详细信息(文件时间信息等) #}
{% for fruit in allname %}
<br>
{{ fruit }}
{% endfor %}
<br><br><br><br>
{# 将指定文件夹中的文件获取遍历显示 #}
{% for n in name %}
<a href="downloads/{{ n }}">{{ n }}</a>
<br><br>
{% endfor %}
</div>
</body>
</html>
运行
- 文件上传和下载的视图函数代码都完成后,开始运行项目
app.py(在编写好试图代码的最下方编写运行代码)
"""
运行项目
"""
if __name__ == '__main__':
HOST = '0.0.0.0'
PORT = 8990
app.run(host=HOST, port=PORT, debug=True)
- 打开调试模式后,运行项目建议在Pycharm中的Terminal命令行中输入以下运行
python app.py
|