如何在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
相关产品推荐
相关产品推荐

