插件窝 干货文章 Flask如何读取MySQL数据库中的图片并返回给前端?

Flask如何读取MySQL数据库中的图片并返回给前端?

image 数据库 cursor 图片 580    来源:    2025-03-31

Flask读取MySQL数据库中的图片并返回给前端

在Flask中读取MySQL数据库中的图片并返回给前端,主要有两种实现方式:

方法一:图片以BLOB格式存储在数据库中

1. 数据库表设计

CREATE TABLE images (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    data LONGBLOB,
    mimetype VARCHAR(50)
);

2. Flask后端代码

from flask import Flask, send_file, Response
from io import BytesIO
import pymysql

app = Flask(__name__)

# 数据库配置
db_config = {
    'host': 'localhost',
    'user': 'your_username',
    'password': 'your_password',
    'database': 'your_database'
}

@app.route('/image/<int:image_id>')
def get_image(image_id):
    try:
        # 连接数据库
        conn = pymysql.connect(**db_config)
        cursor = conn.cursor()

        # 查询图片数据
        cursor.execute("SELECT data, mimetype FROM images WHERE id = %s", (image_id,))
        img_data, mimetype = cursor.fetchone()

        # 关闭连接
        cursor.close()
        conn.close()

        if img_data:
            # 返回图片响应
            return Response(img_data, mimetype=mimetype)
        else:
            return "Image not found", 404

    except Exception as e:
        return str(e), 500

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

3. 前端调用

<img src="/image/1" alt="Database Image">

方法二:图片路径存储在数据库中(推荐)

更常见的做法是将图片存储在文件系统中,数据库中只保存图片路径。

1. 数据库表设计

CREATE TABLE images (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(100),
    path VARCHAR(255)
);

2. Flask后端代码

from flask import Flask, send_from_directory
import os
import pymysql

app = Flask(__name__)

# 数据库配置
db_config = {
    'host': 'localhost',
    'user': 'your_username',
    'password': 'your_password',
    'database': 'your_database'
}

# 图片存储目录
IMAGE_FOLDER = 'static/images'

@app.route('/image/<int:image_id>')
def get_image(image_id):
    try:
        # 连接数据库
        conn = pymysql.connect(**db_config)
        cursor = conn.cursor()

        # 查询图片路径
        cursor.execute("SELECT path FROM images WHERE id = %s", (image_id,))
        path = cursor.fetchone()[0]

        # 关闭连接
        cursor.close()
        conn.close()

        if path:
            # 返回图片文件
            return send_from_directory(IMAGE_FOLDER, path)
        else:
            return "Image not found", 404

    except Exception as e:
        return str(e), 500

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

3. 前端调用

<img src="/image/1" alt="Database Image">

上传图片到数据库的示例

from flask import Flask, request, jsonify
import pymysql

app = Flask(__name__)

# 数据库配置
db_config = {
    'host': 'localhost',
    'user': 'your_username',
    'password': 'your_password',
    'database': 'your_database'
}

@app.route('/upload', methods=['POST'])
def upload_image():
    if 'file' not in request.files:
        return jsonify({'error': 'No file part'}), 400

    file = request.files['file']
    if file.filename == '':
        return jsonify({'error': 'No selected file'}), 400

    try:
        # 读取文件数据
        img_data = file.read()
        mimetype = file.mimetype

        # 连接数据库
        conn = pymysql.connect(**db_config)
        cursor = conn.cursor()

        # 插入图片数据
        cursor.execute(
            "INSERT INTO images (name, data, mimetype) VALUES (%s, %s, %s)",
            (file.filename, img_data, mimetype)
        )
        conn.commit()

        # 获取插入的ID
        image_id = cursor.lastrowid

        # 关闭连接
        cursor.close()
        conn.close()

        return jsonify({'success': True, 'image_id': image_id}), 200

    except Exception as e:
        return jsonify({'error': str(e)}), 500

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

注意事项

  1. 性能考虑:存储大量图片在数据库中会影响性能,推荐使用方法二(存储路径)
  2. 内存管理:处理大图片时要注意内存使用
  3. 安全:验证上传的文件确实是图片,防止恶意文件上传
  4. 数据库连接:生产环境中应使用连接池管理数据库连接
  5. 错误处理:添加适当的错误处理和日志记录

以上两种方法都能实现从MySQL读取图片并返回给前端,根据实际需求选择合适的方式。