文件上传
文件验证
简单示例:
HTML文件upload.html主要代码
<form action="" method="post" enctype="multipart/form-data"> <table> <tbody> <tr> <td>头像:</td> <td><input type="file" name="avatar"></td> </tr> <tr> <td>描述:</td> <td><input type="text" name="desc"></td> </tr> <tr> <td></td> <td><input type="submit" value="提交"></td> </tr> </tbody> </table> </form>
浏览器效果
表单对象文件forms.py
from wtforms import Form, FileField, StringField from wtforms.validators import InputRequired from flask_wtf.file import FileRequired, FileAllowed class UploadFileForm(Form): # FileField表示字段为文件类型 avatar = FileField(validators=[FileRequired(), FileAllowed([‘jpg‘, ‘png‘, ‘gif‘])]) # StringField表示字段为字符串类型 desc = StringField(validators=[InputRequired()])
主py文件
import os from werkzeug.utils import secure_filename from werkzeug.datastructures import CombinedMultiDict from flask import Flask, request, render_template, send_from_directory from forms import UploadFileForm app = Flask(__name__) # 所有图片文件放在根目录的images文件夹下 UPLOAD_PATH = os.path.join(os.path.dirname(__file__), ‘images‘) @app.route(‘/upload/‘, methods=[‘GET‘, ‘POST‘]) def upload(): if request.method == ‘GET‘: return render_template(‘upload.html‘) else: # 结合表单request中的多种表单元素 form = UploadFileForm(CombinedMultiDict([request.form, request.files])) if form.validate(): # 根据html中对应标签的name属性获取对应上传的数据 # request.form相当于一个字典 # desc = request.form.get(‘desc‘) desc = form.desc.data print(desc) # 获取文件需要从request.files中获取 # avatar = request.files.get(‘avatar‘) avatar = form.avatar.data # 为了安全起见,需要将文件名使用特殊方式(secure_filename函数)过滤处理一下 # secure_filename对中文支持不是很好,可以对文件名进行转换,但是仍然推荐使用这个函数来进行处理一下 filename = secure_filename(avatar.filename) # 返回的文件对象可以直接通过它的save方法传入路径保存,路径不能是相对路径,需要是绝对路径 avatar.save(os.path.join(UPLOAD_PATH, filename)) return ‘文件上传成功!‘ else: print(form.errors) return ‘文件上传失败!‘ @app.route(‘/images/<filename>/‘) def get_image(filename): # 获取文件返回到浏览器中,使用send_from_directory,第一个参数是文件目录,第二个参数是文件名 return send_from_directory(UPLOAD_PATH, filename) if __name__ == ‘__main__‘: app.run(debug=True)
原文:https://www.cnblogs.com/guyuyun/p/11223447.html