You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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 }}

问题原因

  1. HTML表单缺少文件上传必需的enctype属性:
    包含文件上传字段的表单必须设置enctype="multipart/form-data",否则浏览器仅会将文件名以字符串形式提交,而非完整的文件对象。这直接导致form.photo.data获取到的是字符串,无法调用文件对象的save方法,进而触发AttributeError。

  2. Python代码存在缩进错误:
    处理代码中print(image)、if image:及后续save语句的缩进层级错误,会引发语法问题或逻辑执行异常。

修复步骤

  1. 修改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>
    
  2. 修正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))
    
  3. 可选:为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 11:12:44