插件窝 干货文章 如何使用Flask将MySQL数据库中的图片返回至前端?

如何使用Flask将MySQL数据库中的图片返回至前端?

图片 数据库 connection cursor 765    来源:    2025-03-31

使用Flask返回MySQL数据库中的图片到前端

在Flask应用中从MySQL返回图片到前端需要几个步骤。下面我将详细介绍完整实现方法。

方案概述

  1. 将图片以BLOB格式存储在MySQL中
  2. 使用Flask创建路由处理图片请求
  3. 从数据库读取图片数据并返回正确的响应

详细实现步骤

1. 数据库准备

首先确保你的MySQL表中有存储图片的BLOB类型字段:

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

2. Flask应用代码

from flask import Flask, Response
import mysql.connector
from mysql.connector import Error

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:
        # 连接数据库
        connection = mysql.connector.connect(**db_config)
        cursor = connection.cursor(dictionary=True)

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

        if record:
            # 返回图片响应
            return Response(record['data'], mimetype=record['mime_type'])
        else:
            return "Image not found", 404

    except Error as e:
        print("Database error:", e)
        return "Database error", 500
    finally:
        if connection.is_connected():
            cursor.close()
            connection.close()

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

3. 上传图片到数据库

你还需要一个上传图片到数据库的路由:

from flask import request

@app.route('/upload', methods=['POST'])
def upload_image():
    if 'file' not in request.files:
        return "No file uploaded", 400

    file = request.files['file']
    if file.filename == '':
        return "No selected file", 400

    try:
        connection = mysql.connector.connect(**db_config)
        cursor = connection.cursor()

        # 读取文件数据
        data = file.read()
        mime_type = file.mimetype

        # 插入数据库
        query = "INSERT INTO images (name, data, mime_type) VALUES (%s, %s, %s)"
        cursor.execute(query, (file.filename, data, mime_type))
        connection.commit()

        return "Image uploaded successfully", 200

    except Error as e:
        print("Database error:", e)
        return "Database error", 500
    finally:
        if connection.is_connected():
            cursor.close()
            connection.close()

4. 前端显示图片

在前端HTML中,你可以这样显示图片:

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

其中1是图片在数据库中的ID。

优化建议

  1. 缓存控制:添加适当的HTTP缓存头
  2. 缩略图:考虑存储不同尺寸的图片
  3. 连接池:使用数据库连接池提高性能
  4. 错误处理:增强错误处理和日志记录

替代方案

如果性能是关键考虑因素,可以考虑:

  1. 只在数据库中存储图片路径,实际图片存储在文件系统或对象存储中
  2. 使用专门的CDN服务分发图片

这种方法对于大量图片或高流量场景更合适。

希望这个解决方案对你有帮助!如果有任何问题或需要进一步优化,请随时提问。