如何在猫狗图像分类Web应用中添加图片上传成功提示?
Flask 猫狗图像分类应用上传成功提示实现方案
后端(Flask 视图)修改
先给应用配置密钥(flash 机制依赖这个),然后在上传逻辑里添加成功提示的消息传递:
- 配置应用密钥
app = Flask(__name__) app.secret_key = 'your_secure_secret_key' # 生产环境用随机生成的密钥,别硬写明文
- 修改上传处理函数
from flask import Flask, render_template, request, flash, redirect, url_for import os from werkzeug.utils import secure_filename # 允许的文件类型 ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg'} def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': # 检查是否有文件提交 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): filename = secure_filename(file.filename) # 创建uploads目录(如果不存在) upload_dir = 'uploads' if not os.path.exists(upload_dir): os.makedirs(upload_dir) file.save(os.path.join(upload_dir, filename)) # 发送上传成功提示 flash('Image uploaded successfully!') # 重定向回上传页,避免表单重复提交 return redirect(url_for('upload_file')) return render_template('upload.html')
前端(HTML 模板)修改
在上传页面里添加提示显示区域,用简单的样式和脚本让提示更友好:
<!doctype html> <html> <head> <title>猫狗图像分类</title> <style> .tip-box { padding: 10px; margin: 10px 0; border-radius: 4px; display: none; } .success-tip { background-color: #d4edda; color: #155724; border: 1px solid #c3e6cb; } .error-tip { background-color: #f8d7da; color: #721c24; border: 1px solid #f5c6cb; } </style> </head> <body> <h1>上传猫狗图像</h1> <!-- 提示消息显示区 --> {% with messages = get_flashed_messages() %} {% if messages %} {% for msg in messages %} <div class="tip-box {{ 'success-tip' if 'successfully' in msg else 'error-tip' }}" id="tip"> {{ msg }} </div> {% endfor %} {% endif %} {% endwith %} <form method=post enctype=multipart/form-data> <input type=file name=file accept=".jpg,.jpeg,.png"> <input type=submit value="Upload Image"> </form> <script> // 自动显示提示并3秒后隐藏 const tipBox = document.getElementById('tip'); if (tipBox) { tipBox.style.display = 'block'; setTimeout(() => { tipBox.style.display = 'none'; }, 3000); } </script> </body> </html>
可选:无刷新上传方案(AJAX)
如果想要页面不刷新就显示提示,改成异步上传方式:
前端修改
<form id="uploadForm" enctype=multipart/form-data> <input type=file name=file accept=".jpg,.jpeg,.png"> <button type="submit">Upload Image</button> </form> <div class="tip-box success-tip" id="successTip" style="display: none;"></div> <div class="tip-box error-tip" id="errorTip" style="display: none;"></div> <script> const form = document.getElementById('uploadForm'); const successTip = document.getElementById('successTip'); const errorTip = document.getElementById('errorTip'); form.addEventListener('submit', async (e) => { e.preventDefault(); const formData = new FormData(form); try { const res = await fetch('/', { method: 'POST', body: formData }); const data = await res.json(); if (data.success) { successTip.textContent = data.message; successTip.style.display = 'block'; setTimeout(() => successTip.style.display = 'none', 3000); form.reset(); // 清空文件选择框 } else { errorTip.textContent = data.message; errorTip.style.display = 'block'; setTimeout(() => errorTip.style.display = 'none', 3000); } } catch (err) { errorTip.textContent = '上传失败,请重试'; errorTip.style.display = 'block'; setTimeout(() => errorTip.style.display = 'none', 3000); } }); </script>
后端对应修改
from flask import jsonify @app.route('/', methods=['GET', 'POST']) def upload_file(): if request.method == 'POST': if 'file' not in request.files: return jsonify({'success': False, 'message': '未检测到文件'}) file = request.files['file'] if file.filename == '': return jsonify({'success': False, 'message': '请选择图片'}) if file and allowed_file(file.filename): filename = secure_filename(file.filename) upload_dir = 'uploads' if not os.path.exists(upload_dir): os.makedirs(upload_dir) file.save(os.path.join(upload_dir, filename)) # 这里可以追加分类逻辑,把结果一起返回 return jsonify({'success': True, 'message': 'Image uploaded successfully!'}) else: return jsonify({'success': False, 'message': '仅支持JPG/PNG格式图片'}) return render_template('upload.html')
内容的提问来源于stack exchange,提问作者muilI opo
相关产品推荐
相关产品推荐

