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

在Flask-Admin与SQLAlchemy中自动存入文件名或绝对路径至数据库

解决方法

要实现上传图片时自动把文件名/绝对路径存入url_pic字段,只需要在验证函数里直接操作表单的对应字段即可,具体修改如下:

1. 修正验证函数,添加文件名赋值逻辑

在picture_validation函数中,验证通过后直接将文件名(或绝对路径)赋值给表单的url_pic字段。同时要注意文件流的位置重置,避免读取二进制数据时出错:

def picture_validation(form, field):
    if field.data:
        filename = field.data.filename
        # 更严谨的后缀判断(兼容大小写)
        if not filename.lower().endswith('.jpg'): 
            raise ValidationError('文件必须是.jpg格式')
        
        file_stream = field.data.stream
        # 重置流位置,避免imghdr读取后影响后续二进制读取
        file_stream.seek(0)
        if imghdr.what(file_stream) != 'jpeg':
            raise ValidationError('文件必须是有效的JPEG图片')
        
        # 再次重置流位置,准备读取二进制数据
        file_stream.seek(0)
        # 将文件名赋值给url_pic字段
        form.url_pic.data = filename
        
        # 如果需要存绝对路径,可替换成下面的代码(需先配置上传目录)
        # import os
        # upload_dir = app.config.get('UPLOAD_FOLDER', './uploads')
        # os.makedirs(upload_dir, exist_ok=True)
        # abs_path = os.path.abspath(os.path.join(upload_dir, filename))
        # form.url_pic.data = abs_path
        
        # 读取二进制数据存入pic字段
        field.data = file_stream.read()
    return True

2. 可选:隐藏表单中的url_pic字段

如果不想让用户手动输入url_pic,可以从form_columns中移除该字段,让它完全由上传逻辑自动填充:

form_columns = ['id', 'pic']  # 去掉'url_pic'

3. 优化数据库字段长度(可选)

如果要存储绝对路径,原String(50)可能不够用,建议修改User模型的url_pic字段长度:

url_pic = Column(String(255), nullable=False)  # 扩容到255字符

这样修改后,创建用户时上传图片,文件名(或绝对路径)就会自动存入url_pic字段,无需手动输入。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:20:31