Flask结合HTML表单实现文件上传时POST方法失效问题求助
问题分析与解决方案
核心问题
你的/upload路由未生效的直接原因是Python代码中的缩进错误:def upload():语句缩进了,导致Flask无法正确注册该路由。当表单提交时,因为找不到匹配的/upload路由,请求被默认处理,最终回到/路由并以GET方式携带file参数。
修复步骤及完整代码
1. 修复路由函数缩进
将def upload():与上方的@app.route('/upload', methods=['POST', 'GET'])左对齐,确保Flask能识别该路由。
2. 修正文件路径问题
Windows系统路径中的反斜杠需要转义,或使用原始字符串,避免转义字符解析错误。同时使用os.path.join拼接路径,保证跨平台兼容性。
3. 增加文件名安全处理
使用secure_filename处理上传的文件名,避免路径遍历等安全问题。
4. 确保上传目录存在
添加代码自动创建上传目录,防止因目录不存在导致文件保存失败。
修复后的Python代码
from flask import Flask, render_template, request import os from werkzeug.utils import secure_filename app = Flask(__name__) # 使用原始字符串处理Windows路径,避免转义错误 UPLOAD_FOLDER = r'C:\Users\caiop\Downloads\test' app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER # 确保上传目录存在 os.makedirs(UPLOAD_FOLDER, exist_ok=True) @app.route('/') def index(): return render_template('index.html') # 修复缩进:def upload与@app.route左对齐 @app.route('/upload', methods=['POST', 'GET']) def upload(): if request.method == 'POST': if 'file' not in request.files: return "test001" file = request.files['file'] if file.filename == '': return "test000" if file: # 使用secure_filename处理文件名,并用os.path.join拼接路径 filename = secure_filename(file.filename) file_path = os.path.join(app.config['UPLOAD_FOLDER'], filename) file.save(file_path) return "OK" if __name__ == '__main__': app.run(debug=True)
HTML代码(无需修改,确认表单属性正确)
<form action="/upload" method="post" enctype="multipart/form-data" class="inner-form" id="upload"> <input id="filer" type="file" name="file"> <input id="typer" type="submit" value="Upload"> </form>
验证效果
启动Flask应用后,选择文件点击上传,页面会跳转到127.0.0.1:5000/upload并显示"OK",文件将被保存到指定的test目录中。
内容的提问来源于stack exchange,提问作者Caio Silva
相关产品推荐
相关产品推荐

