在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
相关产品推荐
相关产品推荐

