五十七:flask文件上傳之使用flask-wtf驗證上傳的文件


 

1、安裝:pip install flask-wtf
2、定義表單驗證的時候,對文件的字段,需使用:FileField
3、驗證器從flask_wtf.file中導入,FileRequired為驗證文件必傳,FileAllowed為驗證文件后綴名
4、在視圖函數中,使用werkzeug.datastructures.CombinedMultiDict來把request.form和request.files合並,再傳給form驗證

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>上傳文件</title>
</head>
<body>
<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>
</body>
</html>

from wtforms import Form, StringField, FileField  # 校驗文件類型
from wtforms.validators import InputRequired

from flask_wtf.file import FileRequired # 驗證文件必傳
from flask_wtf.file import FileAllowed # 驗證文件后綴名


class UploadForm(Form):
avatar = FileField(validators=[FileRequired('文件必傳'), FileAllowed(['jpg', 'png', 'gif'], message='文件格式錯誤')])
desc = StringField(validators=[InputRequired('描述信息必填')])

import os
from flask import Flask, request, render_template, send_from_directory
from werkzeug.utils import secure_filename
from werkzeug.datastructures import CombinedMultiDict

from forms import UploadForm

app = Flask(__name__)


@app.route('/upload/', methods=['GET', 'POST'])
def upload():
form = UploadForm(CombinedMultiDict([request.form, request.files])) # 將文件與文字信息都傳給form
if request.method == 'POST':
if form.validate():
desc = request.desc.data # == request.form.get('desc') # 獲取描述信息
avatar = request.avatar.data # == request.files.get('avatar') # 獲取文件:request.files
filename = secure_filename(avatar.filename) # 防黑客在文件名上做手腳:../../User/xxx/.bashrc
avatar.save(os.path.join('files', filename)) # 保存文件
print(desc)
return '文件上傳成功'
else:
return form.errors
return render_template('upload.html')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM