
在 Flask 应用中实现多张图片上传并同时显示的功能,关键在于正确管理每个上传文件的状态,避免覆盖。以下将详细介绍如何通过结合 Flask 的 session 功能,简化 Python 代码和 HTML 模板,使得多个图片可以独立上传和显示。
Flask 的 session 对象允许你在用户会话期间存储数据。这非常适合用于保存上传文件的信息,以便在后续请求中访问。
首先,确保你已经安装了 Flask Session:
pip install 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/<filename>')
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)代码解释:
修改你的 HTML 模板(例如 index.html)以显示多个图片,并使用 session 中存储的文件名:
<div class="container">
<div class="row">
<h2>Select a content image to upload</h2>
<p>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</p>
<div>
{% if session['content_file'] %}
<img src="{{ url_for('display_image', filename=session['content_file']) }}">
{% endif %}
</div>
<form method="post" action="/" enctype="multipart/form-data">
<dl>
<p>
<input type="file" name="content_file" class="form-control" autocomplete="off" required>
</p>
</dl>
<p>
<input type="submit" value="Submit" class="btn btn-info">
</p>
</form>
</div>
<div class="row">
<h2>Select a style image to upload</h2>
<p>
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</p>
<div>
{% if session['style_file'] %}
<img src="{{ url_for('display_image', filename=session['style_file']) }}">
{% endif %}
</div>
<form method="post" action="/" enctype="multipart/form-data">
<dl>
<p>
<input type="file" name="style_file" class="form-control" autocomplete="off" required>
</p>
</dl>
<p>
<input type="submit" value="Submit" class="btn btn-info">
</p>
</form>
</div>
</div>代码解释:
通过使用 Flask 的 session 功能,可以轻松地管理多个上传文件的状态,并在 HTML 模板中同时显示它们。这种方法避免了覆盖之前上传的文件,并且简化了代码结构。记住,为了安全起见,务必设置一个安全的 SECRET_KEY。此外,请确保在运行应用前创建 UPLOAD_FOLDER 目录。
以上就是在 Flask 中实现多张图片上传并同时显示的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号