app.py主代码:
import os.path
from flask import Flask, render_template, render_template_string, redirect, url_for, request
from flask_sqlalchemy import SQLAlchemy
from werkzeug.utils import secure_filename
from forms import LoginForm, RegisterForm, userAvatarForm
app = Flask(__name__)
app.config["WTF_CSRF_SECRET_KEY"] = "abc1234aaa"
# 自定义扩展获取文件路径
app.config["UPLOAD_PATH"] = os.path.join(os.path.dirname(__file__), "medias")
@app.route("/avatar/upload", methods=["POST", "GET"])
def avatar_upload():
"""头像上传"""
form = userAvatarForm()
if form.validate_on_submit():
# 获取图片对象
img = form.avatar.data
f_name = secure_filename(img.filename)
file_path = os.path.join(os.path.dirname(__file__), "medias")
# 使用自定义扩展获取文件路径
# file_name = os.path.join(app.config["UPLOAD_PATH"], f_name)
file_name = os.path.join(file_path, f_name)
img.save(file_name)
print("保存成功")
return redirect(url_for("avatar_upload"))
else:
print(form.errors)
return render_template("avatar_upload.html", form=form)
forms表单代码:
import re
from flask_wtf import FlaskForm
from flask_wtf.file import FileRequired, FileAllowed
from wtforms import StringField, PasswordField, SubmitField, DateField, IntegerField, FileField
from wtforms.validators import DataRequired, ValidationError
class userAvatarForm(FlaskForm):
"""用户头像上传"""
avatar = FileField(label="上传头像", validators=[
FileRequired("请选择头像文件"),
FileAllowed(["png"], "仅支持PNG图片上传")
])
HTML代码:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>WTF文件上传</title>
</head>
<body>
<form action="{{ url_for("avatar_upload") }}" method="post" enctype="multipart/form-data">
{{ form.csrf_token }}
<p>
{{ form.avatar.label }}
{{ form.avatar }}
</p>
<p>
<input type="submit" value="WTF提交">
</p>
</form>
</body>
</html>