Flask WTForms使用MultipleFileField多文件上传报错如何解决?
Flask-WTF多文件上传报错解决方法
问题原因
遍历form.files.data拿到字符串而非文件对象,核心是以下几个配置错误导致:
- 前端表单未设置
enctype="multipart/form-data"属性,浏览器默认以普通表单格式序列化文件内容,导致后端接收不到文件对象 - 表单类验证器写法错误,
validators参数应传入列表而非集合 - 未正确导入官方
MultipleFileField组件
修复步骤
- 修正表单类代码
首先确认从正确路径导入组件,同时修正验证器写法:
from flask_wtf import FlaskForm from flask_wtf.file import MultipleFileField, DataRequired from wtforms import SubmitField class CreatePostForm(FlaskForm): # validators参数用中括号[]包裹,不要用大括号{} files = MultipleFileField('Upload files', validators=[DataRequired()]) submit = SubmitField(_l('Submit'))
- 补充前端表单的
enctype属性
在create_post.html的表单标签里添加属性,示例:
<form method="POST" enctype="multipart/form-data"> {{ form.hidden_tag() }} {{ form.files() }} {{ form.submit() }} </form>
- 可选:优化视图函数增加异常兼容
如果存在偶尔传入空字符串的情况,可以加一层判断过滤无效值:
import os from werkzeug.utils import secure_filename @app.route('/create_post', methods=['GET', 'POST']) @login_required def create_post(): form = CreatePostForm() if form.validate_on_submit(): files_filenames = [] for file in form.files.data: # 过滤空值和字符串类型的异常数据 if not file or isinstance(file, str): continue file_filename = secure_filename(file.filename) file.save(os.path.join(app.config['UPLOAD_FOLDER'], file_filename)) files_filenames.append(file_filename) return redirect(url_for('index')) return render_template('create_post.html', form=form)
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

