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

如何将图片存入SQL数据库并在Flask网页展示(含BLOB转图片方法)

将JPG存入SQL BLOB并在Flask中展示的解决方案

一、将JPG存入SQL数据库的BLOB字段

先把本地JPG文件读取为二进制数据,再插入到SQL的BLOB字段中。以下以SQLite为例(MySQL/PostgreSQL逻辑类似,仅连接语法有差异):

import sqlite3

# 连接数据库(不存在则自动创建)
conn = sqlite3.connect('images.db')
cursor = conn.cursor()

# 创建图片存储表(不存在则创建)
cursor.execute('''
    CREATE TABLE IF NOT EXISTS images (
        id INTEGER PRIMARY KEY AUTOINCREMENT,
        img_data BLOB,
        filename TEXT
    )
''')

# 读取JPG文件为二进制流
with open('test.jpg', 'rb') as f:
    img_binary = f.read()

# 插入数据到数据库
cursor.execute('INSERT INTO images (img_data, filename) VALUES (?, ?)', (img_binary, 'test.jpg'))
conn.commit()
conn.close()

二、在Flask中展示数据库中的图片

提供两种常用实现方式,可根据图片大小和需求选择:

方式1:通过独立路由返回图片数据

适合较大图片,通过Flask路由直接返回二进制图片数据,HTML的img标签指向该路由地址。

Flask后端代码

from flask import Flask, render_template, make_response
import sqlite3

app = Flask(__name__)

@app.route('/')
def index():
    # 获取所有图片的ID和文件名,用于前端列表展示
    conn = sqlite3.connect('images.db')
    cursor = conn.cursor()
    cursor.execute('SELECT id, filename FROM images')
    images = cursor.fetchall()
    conn.close()
    return render_template('index.html', images=images)

@app.route('/image/<int:image_id>')
def get_image(image_id):
    # 根据ID从数据库取出图片二进制数据
    conn = sqlite3.connect('images.db')
    cursor = conn.cursor()
    cursor.execute('SELECT img_data FROM images WHERE id = ?', (image_id,))
    img_data = cursor.fetchone()[0]
    conn.close()
    
    # 返回图片响应,设置正确的Content-Type
    response = make_response(img_data)
    response.headers['Content-Type'] = 'image/jpeg'
    return response

if __name__ == '__main__':
    app.run(debug=True)

前端模板(templates/index.html)

<!DOCTYPE html>
<html>
<head>
    <title>数据库图片展示</title>
</head>
<body>
    <h1>存储的图片列表</h1>
    {% for img in images %}
        <div style="margin: 20px 0;">
            <p>{{ img[1] }}</p>
            <img src="/image/{{ img[0] }}" alt="{{ img[1] }}" width="300">
        </div>
    {% endfor %}
</body>
</html>

方式2:将BLOB转为Base64直接嵌入HTML

无需额外路由,直接把图片编码为Base64字符串嵌入到img标签的src中,适合小型图片(避免频繁请求)。

Flask后端代码

from flask import Flask, render_template
import sqlite3
import base64

app = Flask(__name__)

@app.route('/')
def index():
    conn = sqlite3.connect('images.db')
    cursor = conn.cursor()
    cursor.execute('SELECT img_data, filename FROM images')
    images = []
    for img_data, filename in cursor.fetchall():
        # 将二进制图片转为Base64字符串
        img_base64 = base64.b64encode(img_data).decode('utf-8')
        images.append({'filename': filename, 'base64': img_base64})
    conn.close()
    return render_template('index.html', images=images)

if __name__ == '__main__':
    app.run(debug=True)

前端模板(templates/index.html)

<!DOCTYPE html>
<html>
<head>
    <title>数据库图片展示</title>
</head>
<body>
    <h1>存储的图片列表</h1>
    {% for img in images %}
        <div style="margin: 20px 0;">
            <p>{{ img.filename }}</p>
            <img src="data:image/jpeg;base64,{{ img.base64 }}" alt="{{ img.filename }}" width="300">
        </div>
    {% endfor %}
</body>
</html>

注意事项

  • 大图片不建议使用Base64方式,会大幅增加HTML文件体积,影响页面加载速度。
  • 部分数据库的BLOB字段有大小限制,比如MySQL的BLOB最大仅支持64KB,存储更大图片需改用MEDIUMBLOB或LONGBLOB类型。

内容的提问来源于stack exchange,提问作者T. Ray

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 13:55:14