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

使用Flask-WTF上传文件时secure_filename报TypeError错误的解决方法

错误修复方案及问题解答

错误原因

secure_filename()函数要求传入字符串类型的文件名,但你传入的是FileStorage对象(Flask-WTF文件字段提交后返回的对象),因此触发TypeError。

修复方法

从FileStorage对象中提取文件名字符串,调用其.filename属性即可,修改代码行如下:

filename_is_secure = secure_filename(picture_filename.filename)

完整处理示例(参考)

假设你的表单定义包含文件字段,视图中完整的文件上传处理逻辑如下:

import os
from flask import Flask, render_template
from flask_wtf import FlaskForm
from wtforms import FileField, SubmitField
from werkzeug.utils import secure_filename
from your_models import Posts, db  # 导入你的Posts模型和数据库实例

app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = '/path/to/your/upload/directory'  # 设置文件上传目录
app.config['SECRET_KEY'] = 'your-secret-key-here'

class PostForm(FlaskForm):
    picture = FileField('上传图片')
    submit = SubmitField('发布帖子')

@app.route('/', methods=['GET', 'POST'])
def home():
    form = PostForm()
    if form.validate_on_submit():
        # 获取表单提交的FileStorage对象
        picture_file = form.picture.data
        # 生成安全文件名
        safe_filename = secure_filename(picture_file.filename)
        # 保存文件到服务器指定目录
        picture_file.save(os.path.join(app.config['UPLOAD_FOLDER'], safe_filename))
        # 将安全文件名存入Posts表(如果需要)
        new_post = Posts(image_filename=safe_filename)
        db.session.add(new_post)
        db.session.commit()
        return '帖子发布成功'
    return render_template('home.html', form=form)

与Posts表的关系

这个错误本身和Posts表代码无关——它是文件处理阶段的类型匹配错误,和数据库模型逻辑没有直接关联。但修复后,正确生成的安全文件名可以正常存入Posts表对应的字段中。

报错栈验证

从报错栈信息中可以看到,错误发生在secure_filename函数调用时,传入的参数类型为FileStorage,而非预期的字符串,这也验证了上述修复方向的正确性。


内容的提问来源于stack exchange,提问作者user20849957

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 03:30:43