Flask无法接收HTML表单上传文件,请求排查问题
问题:Flask无法接收HTML表单中的文件上传
我正在为Web工具开发文件上传功能,但遇到Flask无法接收HTML表单中文件的问题。已配置POST方法的路由,表单也设置了method为POST、enctype为multipart/form-data属性,但问题仍未解决,请问哪里操作有误?
HTML代码
<form action="/" method="POST" enctype="multipart/form-data" class="form-horizontal"> <div class="row form-group"> <div class="col-12 col-md-12"> <div class="control-group" id="fields"> <label class="control-label" for="field1"> Requests </label> <div class="controls"> <div class="entry input-group upload-input-group"> <input class="form-control" name="fields[]" type="file"> <button class="btn btn-upload btn-success btn-add" type="button"> <i class="fa fa-plus"></i> </button> </div> </div> <button class="btn btn-primary" type="submit" value="Submit">Upload</button> </div> </div> </div> </form>
Flask代码
import os from flask import Flask, flash, request, redirect, render_template from werkzeug.utils import secure_filename app=Flask(__name__) app.secret_key = "secret key" app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 path = os.getcwd() # file Upload UPLOAD_FOLDER = os.path.join(path, 'uploads') if not os.path.isdir(UPLOAD_FOLDER): os.mkdir(UPLOAD_FOLDER) app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER ALLOWED_EXTENSIONS = set(['xlsx', 'xls']) def allowed_file(filename): return '.' in filename and filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS @app.route('/') def upload_form(): return render_template('index.html') @app.route('/', methods=['POST']) def upload_file(): if request.method == 'POST': # check if the post request has the file part if 'file' not in request.files: flash('No file part') return redirect(request.url) file = request.files['file'] if file.filename == '': flash('No file 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)) flash('File successfully uploaded') return redirect('/') else: flash('Allowed file types are xlsx and xls') return redirect(request.url) if __name__ == "__main__": app.run(host = '127.0.0.1',port = 5000, debug = False)
问题根源与修复方案
核心错误
表单中文件输入框的name属性是fields[],但Flask代码中尝试通过request.files['file']获取文件,两者名称不匹配,导致无法找到上传的文件。另外,你的表单支持动态添加多个文件(带+按钮),需要处理多文件上传的场景。
修正后的Flask上传逻辑
替换原upload_file函数为以下代码:
@app.route('/', methods=['POST']) def upload_file(): if request.method == 'POST': # 获取所有上传的文件,对应表单中的name="fields[]" files = request.files.getlist('fields[]') # 检查是否有有效文件被上传 if not files or all(file.filename == '' for file in files): flash('No file selected for uploading') return redirect(request.url) success_count = 0 for file in files: if file.filename == '': continue if file and allowed_file(file.filename): filename = secure_filename(file.filename) # 处理重名文件,避免覆盖已存在的文件 base, ext = os.path.splitext(filename) counter = 1 while os.path.exists(os.path.join(app.config['UPLOAD_FOLDER'], filename)): filename = f"{base}_{counter}{ext}" counter += 1 file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) success_count += 1 if success_count > 0: flash(f'Successfully uploaded {success_count} file(s)') else: flash('Allowed file types are xlsx and xls') return redirect('/')
修正说明
- 使用
request.files.getlist('fields[]')获取所有上传的文件,匹配表单中文件输入框的name属性。 - 循环处理每个文件,跳过未选择文件的输入框。
- 添加重名文件处理逻辑,避免覆盖服务器上已存在的文件。
- 反馈成功上传的文件数量,提升用户体验。
内容的提问来源于stack exchange,提问作者Roberto
相关产品推荐
相关产品推荐

