项目结构
app.py:
import os
from flask import Flask, request, jsonify, render_template, url_for, flash, redirect
from werkzeug.utils import secure_filename
ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
UPLOAD_FOLDER = os.path.dirname(__file__)
app = Flask(__name__)
app.secret_key = '666'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024
def allowed_file(filename):
return '.' in filename and filename.rsplit('.',1)[-1].lower() in ALLOWED_EXTENSIONS
# 上传文件
@app.route('/upload',methods=['GET','POST'])
def upload():
if request.method == 'GET':
return render_template('upload.html')
if request.method == 'POST':
# 检查是否有文件部分
if 'file' not in request.files:
flash('No file part')
return redirect(request.url)
file = request.files['file']
folder = request.form.get('folder')
# 判断是否存在文件
if file.filename == '':
flash('No selected file')
return redirect(request.url)
# 判断文件名是否允许
if file and allowed_file(file.filename):
# 文件存放路径是否存在,不存在就创建
path = '/static/' + folder + '/' # 相对路径
end_path = UPLOAD_FOLDER + '/static/' + folder + '/' # 最终路径
if not os.path.exists(end_path):
os.makedirs(end_path)
# 安全的去文件名,但是不识别中文,后续解决
filename = secure_filename(file.filename)
# 保存文件 http://127.0.0.1:1000/static/img/1.jpg
file.save(end_path + filename)
flash(f'Upload Success! 文件路径:{path+filename}')
return render_template('upload.html',url=path+filename)
else:
flash('Not file or Not allowed')
return redirect(request.url)
if __name__ == '__main__':
app.run()
templates:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上传文件</title>
</head>
<body>
<form method="post" enctype="multipart/form-data">
<a>文件:</a><input type="file" name="file" placeholder="请上传文件"> <br>
<a>文件夹:</a><input type="text" name="folder" placeholder="文件夹"> <br>
<input type="submit" value="提交">
{# 使用遍历获取闪现的消息 #}
{% for message in get_flashed_messages() %}
{{ message }}
{% endfor %}
</form>
<br>
{# 展示图片 #}
<img src="{{ url }}" alt="">
</body>
</html>
解决 secure_filename:
1、Ctrl + 鼠标左键,跳转
2、在 utils.py 文件中,修改:
- 37行:filename_ascii_strip_re = re.compile(r’[^A-Za-z0-9.-]’)
- 后面加上:filename_gbk_strip_re = re.compile(u"[^\u4e00-\u9fa5A-Za-z0-9.-]")
3、在 415 行,改 acsii 为 utf-8
4、在 424 行,_filename_ascii_strip_re 改成 _filename_gbk_strip_re