You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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('/')

修正说明

  1. 使用request.files.getlist('fields[]')获取所有上传的文件,匹配表单中文件输入框的name属性。
  2. 循环处理每个文件,跳过未选择文件的输入框。
  3. 添加重名文件处理逻辑,避免覆盖服务器上已存在的文件。
  4. 反馈成功上传的文件数量,提升用户体验。

内容的提问来源于stack exchange,提问作者Roberto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 03:31:03