使用Flask WTForm上传图片报错:'str'对象无'data'属性
Flask-WTF图片上传报错:AttributeError: 'str' object has no attribute 'data' 解决方法
问题重现
使用Flask-WTF实现图片上传时出现以下异常:
- 报错信息:
AttributeError: 'str' object has no attribute 'data' - 执行
print(image)仅输出上传文件的文件名,无法获取可操作的文件对象进行保存
相关代码如下:
表单类定义
class Form(FlaskForm): photo = FileField('')
表单验证处理代码
if form.validate_on_submit(): image = form.photo.data print(image) if image: image.save(os.path.join(app.instance_path, img_folder, filename))
HTML模板代码
<span style="font-size:12px">Загрузить фото:</span> {{ form.photo }}
问题原因
HTML表单缺少文件上传必需的
enctype属性:
包含文件上传字段的表单必须设置enctype="multipart/form-data",否则浏览器仅会将文件名以字符串形式提交,而非完整的文件对象。这直接导致form.photo.data获取到的是字符串,无法调用文件对象的save方法,进而触发AttributeError。Python代码存在缩进错误:
处理代码中print(image)、if image:及后续save语句的缩进层级错误,会引发语法问题或逻辑执行异常。
修复步骤
修改HTML表单,添加
enctype属性:
确保表单标签包含正确的编码类型,可配合Flask-WTF的hidden_tag()使用:<form method="POST" enctype="multipart/form-data"> {{ form.hidden_tag() }} <span style="font-size:12px">Загрузить фото:</span> {{ form.photo }} <button type="submit">上传</button> </form>修正Python代码的缩进与文件名安全处理:
调整代码缩进至正确层级,同时使用secure_filename确保文件名合法:from werkzeug.utils import secure_filename import os # 确保上传目录存在 img_folder = 'uploads' upload_path = os.path.join(app.instance_path, img_folder) os.makedirs(upload_path, exist_ok=True) if form.validate_on_submit(): image = form.photo.data print(image) if image: filename = secure_filename(image.filename) image.save(os.path.join(upload_path, filename))可选:为FileField添加验证规则:
增加文件类型、大小验证,提升上传安全性:from wtforms.validators import DataRequired from flask_wtf.file import FileAllowed, FileSize class Form(FlaskForm): photo = FileField('', validators=[ DataRequired(message="请选择文件"), FileAllowed(['jpg', 'png', 'jpeg'], "仅支持图片文件"), FileSize(max_size=1024*1024*2, message="文件大小不能超过2MB") ])
内容的提问来源于stack exchange,提问作者artem
相关产品推荐
相关产品推荐

