Flask调用MySQL中LONGBLOB存储的图片无法显示问题排查
解决Flask读取MySQL LONGBLOB图片无法显示的问题
核心问题是send_file不能直接接收二进制字节数据,它需要类文件对象(比如BytesIO)来处理。以下是具体修正方案:
1. 修正Flask后端代码
先导入BytesIO,把从数据库读取的二进制数据包装成可读取的类文件对象:
from flask import Flask, request, send_file from io import BytesIO # 导入你的数据库驱动,示例用pymysql import pymysql app = Flask(__name__) @app.route('/get_image', methods=['GET']) def get_image(): image_id = request.args.get('image_id') if not image_id: return "缺少image_id参数", 400 # 数据库查询逻辑(根据你的实际配置修改) conn = pymysql.connect( host='localhost', user='你的用户名', password='你的密码', database='你的数据库名' ) cursor = conn.cursor() # 假设表名为images,LONGBLOB字段名为image_blob cursor.execute("SELECT image_blob FROM images WHERE id = %s", (image_id,)) result = cursor.fetchone() conn.close() if not result: return "图片不存在", 404 image_data = result[0] # 将二进制数据转为BytesIO对象 image_io = BytesIO(image_data) # 重置文件指针到开头,确保send_file能完整读取 image_io.seek(0) # 注意:如果图片是JPG/GIF等格式,要对应修改mimetype,比如JPG用'image/jpeg' return send_file(image_io, mimetype='image/png')
2. 关键注意事项
- MIME类型要匹配:如果数据库中的图片不是PNG格式,必须修改
mimetype为对应值(如image/jpeg对应JPG)。建议在数据库额外存储图片格式字段,动态返回正确的MIME类型。 - 禁止编码转换:确保从数据库读取的是原始
bytes类型数据,不要做任何字符串编码/解码操作,否则会破坏图片二进制结构。 - 增加参数校验:对
image_id做非空判断、图片存在性校验,避免无效请求导致的报错。
3. HTML代码无需修改
你的HTML引用逻辑是正确的,只要后端接口正常返回图片数据,浏览器就能正常渲染:
<img src="http://127.0.0.1:5000/get_image?image_id=1"/>
内容的提问来源于stack exchange,提问作者parsecer
相关产品推荐
相关产品推荐

