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

如何在Flask框架中将图片上传至MySQL数据库?

在Flask中实现图片上传至MySQL数据库

1. 准备MySQL数据表

首先需要在你的journal_flask数据库中创建一张用于存储图片的表,使用BLOB类型字段保存图片的二进制数据:

CREATE TABLE images (
    id INT AUTO_INCREMENT PRIMARY KEY,
    filename VARCHAR(255) NOT NULL,
    img_data MEDIUMBLOB NOT NULL,
    upload_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

注:如果需要存储较大图片,可改用LONGBLOB类型

2. 修改Flask代码,添加上传与展示逻辑

在你已有的基础配置代码上,补充文件上传处理和图片展示的路由:

from flask import Flask, render_template, request, redirect, url_for, flash, send_file
from flask_mysqldb import MySQL
import io

app = Flask(__name__)
app.secret_key = "your_actual_secret_key"  # 替换为真实密钥
app.config["MYSQL_HOST"] = "localhost"
app.config["MYSQL_USER"] = "root"
app.config["MYSQL_PASSWORD"] = "your_db_password"  # 填入数据库密码
app.config["MYSQL_DB"] = "journal_flask"
# 限制允许上传的图片格式
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
# 可选:限制上传文件大小(示例为16MB)
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

mysql = MySQL(app)

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS

# 上传页面
@app.route('/')
def upload_page():
    # 查询所有已上传图片,用于展示
    cur = mysql.connection.cursor()
    cur.execute("SELECT id, filename FROM images")
    images = cur.fetchall()
    cur.close()
    return render_template('upload.html', images=images)

# 处理上传请求
@app.route('/upload', methods=['POST'])
def upload_image():
    if 'file' not in request.files:
        flash('未选择任何文件')
        return redirect(request.url)
    file = request.files['file']
    if file.filename == '':
        flash('未选择文件')
        return redirect(request.url)
    if file and allowed_file(file.filename):
        # 读取图片二进制数据
        img_binary = file.read()
        filename = file.filename
        
        # 插入数据库
        cur = mysql.connection.cursor()
        cur.execute("INSERT INTO images (filename, img_data) VALUES (%s, %s)", (filename, img_binary))
        mysql.connection.commit()
        cur.close()
        
        flash('图片上传成功')
        return redirect(url_for('upload_page'))
    else:
        flash('仅支持PNG、JPG、JPEG、GIF格式的图片')
        return redirect(request.url)

# 展示单张图片
@app.route('/image/<int:image_id>')
def display_image(image_id):
    cur = mysql.connection.cursor()
    cur.execute("SELECT filename, img_data FROM images WHERE id = %s", (image_id,))
    result = cur.fetchone()
    cur.close()
    
    if result:
        filename, img_data = result
        # 将二进制数据转为可返回的文件对象
        return send_file(
            io.BytesIO(img_data),
            mimetype=f'image/{filename.rsplit(".",1)[1].lower()}',
            download_name=filename
        )
    else:
        flash('图片不存在')
        return redirect(url_for('upload_page'))

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

3. 创建前端上传模板

在项目根目录下创建templates文件夹,新建upload.html文件:

<!DOCTYPE html>
<html>
<head>
    <title>图片上传至MySQL</title>
</head>
<body>
    <h1>上传图片</h1>
    <!-- 展示提示信息 -->
    {% with messages = get_flashed_messages() %}
      {% if messages %}
        {% for msg in messages %}
          <p style="color:red">{{ msg }}</p>
        {% endfor %}
      {% endif %}
    {% endwith %}

    <!-- 上传表单 -->
    <form method="POST" action="/upload" enctype="multipart/form-data">
        <input type="file" name="file" accept="image/*" required>
        <button type="submit">确认上传</button>
    </form>

    <!-- 展示已上传图片 -->
    <h2>已上传图片</h2>
    {% for img in images %}
        <div style="display:inline-block;margin:10px;">
            <img src="{{ url_for('display_image', image_id=img[0]) }}" width="200" alt="{{ img[1] }}">
            <p>{{ img[1] }}</p>
        </div>
    {% endfor %}
</body>
</html>

4. 关键注意事项

  • 确保项目目录结构正确,templates文件夹需与主代码文件同级
  • 务必替换代码中的密钥和数据库密码为真实有效值
  • 若上传大图片,需根据需求调整MAX_CONTENT_LENGTH和数据库的BLOB类型

内容的提问来源于stack exchange,提问作者Muhammad Azis

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 10:10:13