使用Flask从MySQL数据库检索图片失败求助
解决Flask从MySQL检索图片无法显示的问题
嘿,我来帮你排查下这个问题!从你的代码来看,核心问题是直接把数据库里的photo字段值放到<img>的src属性里了——但MySQL存储图片的方式通常有两种(二进制Blob或文件路径),这两种情况都不能直接这么用。下面分场景给你解决办法:
情况1:数据库存的是图片二进制Blob数据
如果你的photo字段是BLOB类型,存储的是图片的原始二进制数据,那需要专门写一个路由来返回图片的二进制流,设置正确的HTTP头:
步骤1:新增获取图片的路由
from flask import Response @app.route('/get_image/<int:image_id>') def get_image(image_id): cur = mysql.connection.cursor(mysql.cursors.DictCursor) # 用字典游标方便按字段名取值 # 根据图片的唯一ID查询Blob数据(假设你的表有id主键) cur.execute("SELECT photo, mime_type FROM upload WHERE id = %s", (image_id,)) image_record = cur.fetchone() cur.close() if image_record: # 如果数据库存了图片类型(比如image/jpeg)就用这个值;没存的话可以固定写对应类型 return Response(image_record['photo'], mimetype=image_record.get('mime_type', 'image/jpeg')) return "图片未找到", 404
步骤2:修改模板调用路由
把原来的模板代码改成调用上面的路由,通过图片ID获取:
{% for i in imgfile %} <img src="{{ url_for('get_image', image_id=i.id) }}" alt="上传的图片" /> {% endfor %}
注意:如果你的表没有
id主键,用其他唯一标识字段代替即可;另外建议在数据库里新增一个mime_type字段,存储图片的类型(比如image/png),这样返回的响应头更准确。
情况2:数据库存的是图片文件路径
如果上传时你把图片存在了Flask项目的static文件夹下,数据库只存相对路径,那要确保模板里正确指向静态资源:
步骤1:确认图片存储位置
确保图片放在项目的static目录下,比如static/uploads/xxx.jpg,数据库里的photo字段存的是uploads/xxx.jpg这类相对路径。
步骤2:修改模板路径写法
用Flask的url_for生成正确的静态资源URL:
{% for i in imgfile %} <img src="{{ url_for('static', filename=i.photo) }}" alt="上传的图片" /> {% endfor %}
额外排查点
- 游标类型问题:如果你的
cur.fetchall()返回的是元组而不是字典,那i.photo会报错。这时候要把游标改成字典游标(如上面路由里的mysql.cursors.DictCursor),或者用索引取值(比如i[1],根据photo字段在表中的位置调整)。 - 数据库字段值检查:在路由里打印
data看看photo字段是否有有效数据,比如print(data),确认不是空值或错误内容。
内容的提问来源于stack exchange,提问作者Shahriar Shovo
相关产品推荐
相关产品推荐

