
在 Flask 应用中实现多张图片上传并同时显示的功能,关键在于正确管理每个上传文件的状态,避免覆盖。以下将详细介绍如何通过结合 Flask 的 session 功能,简化 Python 代码和 HTML 模板,使得多个图片可以独立上传和显示。
使用 Flask Session 管理图片
Flask 的 session 对象允许你在用户会话期间存储数据。这非常适合用于保存上传文件的信息,以便在后续请求中访问。
1. 安装 Flask Session
首先,确保你已经安装了 Flask Session:
pip install Flask-Session
2. 配置 Flask Session
在你的 Flask 应用中,配置 session:
from flask import Flask, render_template, request, redirect, url_for, flash, session
from flask_session import Session
import os
from werkzeug.utils import secure_filename
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your_secret_key' # 替换为你自己的密钥
app.config['UPLOAD_FOLDER'] = 'static/uploads'
app.config["SESSION_PERMANENT"] = False
app.config["SESSION_TYPE"] = "filesystem"
Session(app)
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif'}
def allowed_file(filename):
return '.' in filename and \
filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS
@app.route('/')
def home():
return render_template('index.html')
@app.route('/', methods=['POST'])
def upload_content():
if not any(f in ['content_file', 'style_file'] for f in request.files):
flash('No file part')
return redirect(request.url)
submitted_file = 'content_file' if 'content_file' in request.files else 'style_file'
file = request.files[submitted_file]
if file.filename == '':
flash('No image selected for uploading')
return redirect(request.url)
if file and allowed_file(file.filename):
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
session[submitted_file] = filename
print('upload_image filename: ' + filename, os.path.join(app.config['UPLOAD_FOLDER'], filename))
flash('Image successfully uploaded and displayed below')
return render_template('index.html')
else:
flash('Allowed image types are - png, jpg, jpeg, gif')
return redirect(request.url)
@app.route('/display/')
def display_image(filename):
return redirect(url_for('static', filename='uploads/' + filename), code=301)
if __name__ == '__main__':
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) # Ensure upload folder exists
app.run(debug=True) 代码解释:
时尚购物程序v1.01、全立体设计。此系统由3个Flash动画为主线(正式版带原文件),设计更形象,网站更有吸引力。这种设计在网店系统内绝无仅有,使您的网店与众不同。2、内置音乐播放器,简单灵活的操作即可完成设置,前台任意调用。并带详细说明文件,一看就懂。合理使用此功能,可使网站更富渲染力。3、支持多图显示,每件产品最多可以上传9张图片。4、后台功能强大,销售管理,财务管理,在线支付平台管理等功能
- app.config['SECRET_KEY']: 设置一个安全的密钥,用于加密 session 数据。请务必更换为你自己的密钥。
- app.config['UPLOAD_FOLDER']: 指定上传文件保存的目录。
- Session(app): 初始化 Flask Session。
- upload_content() 函数:
- 检查请求中是否包含 content_file 或 style_file。
- 根据上传的文件类型,将其保存在 session 中。
3. 修改 HTML 模板
修改你的 HTML 模板(例如 index.html)以显示多个图片,并使用 session 中存储的文件名:
Select a content image to upload
{% with messages = get_flashed_messages() %} {% if messages %}
{% for message in messages %}
{% endif %} {% endwith %}- {{ message }}
{% endfor %}{% if session['content_file'] %} @@##@@ {% endif %}Select a style image to upload
{% with messages = get_flashed_messages() %} {% if messages %}
{% for message in messages %}
{% endif %} {% endwith %}- {{ message }}
{% endfor %}{% if session['style_file'] %} @@##@@ {% endif %}
代码解释:
- {% if session['content_file'] %} 和 {% if session['style_file'] %}: 检查 session 中是否存在相应的文件名,如果存在,则显示图片。
- 和 : 为每个文件上传字段使用不同的 name 属性。
总结
通过使用 Flask 的 session 功能,可以轻松地管理多个上传文件的状态,并在 HTML 模板中同时显示它们。这种方法避免了覆盖之前上传的文件,并且简化了代码结构。记住,为了安全起见,务必设置一个安全的 SECRET_KEY。此外,请确保在运行应用前创建 UPLOAD_FOLDER 目录。









