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

如何使用Flask实现两个独立文件上传并调用Python进行数据处理

双文件同时上传处理实现方案

前端模板修改

原代码使用两个独立表单,每次点击上传只会提交其中一个文件,将两个文件选择框整合到同一个表单内,共用一个提交按钮即可解决问题,调整后的代码如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>双表比对工具</title>
</head>
<body>
<!-- 错误提示区域 -->
{% if err_msg %}
<p style="color: red;">{{ err_msg }}</p>
{% endif %}
<form method="post" enctype="multipart/form-data">
    <div>
        <h2>上传当前版本文件</h2>
        <input type="file" name="curfile" accept=".xlsx" required>
    </div>
    <div>
        <h2>上传新版本文件</h2>
        <input type="file" name="newfile" accept=".xlsx" required>
    </div>
    <br>
    <input type="submit" value="开始比对处理">
</form>
<!-- 处理结果展示区域 -->
{% if result %}
<div>
    <h3>处理结果预览</h3>
    {{ result|safe }}
</div>
{% endif %}
</body>
</html>

代码中新增的accept属性限制前端仅可选择xlsx格式文件,required属性强制两个文件都选中后才能触发提交,同时预留了错误提示和结果展示的渲染位置。

后端逻辑修改

后端需要新增双文件存在校验、后缀合法性校验,确认两个文件都符合要求后再执行pandas处理逻辑,调整后的代码如下:

from flask import Flask, request, render_template
import pandas as pd
from werkzeug.utils import secure_filename

app = Flask(__name__)
app.config["ALLOWED_EXTENSIONS"] = ["xlsx"]
app.config["MAX_CONTENT_LENGTH"] = 16 * 1024 * 1024 # 单文件最大限制16M

# 校验文件后缀合法性
def allowed_file(filename):
    return '.' in filename and filename.rsplit('.', 1)[1].lower() in app.config["ALLOWED_EXTENSIONS"]

@app.route('/', methods=['GET', 'POST'])
def upload():
    if request.method == 'POST':
        # 获取两个上传的文件对象
        cur_file = request.files.get('curfile')
        new_file = request.files.get('newfile')
        
        # 校验:两个文件必须都上传
        if not cur_file or not new_file:
            return render_template('upload.html', err_msg='请选择两个文件后再提交')
        
        # 校验:两个文件格式都符合要求
        if not (allowed_file(cur_file.filename) and allowed_file(new_file.filename)):
            return render_template('upload.html', err_msg='仅支持xlsx格式的文件')
        
        # 安全处理文件名后读取为DataFrame
        secure_filename(cur_file.filename)
        secure_filename(new_file.filename)
        dfcur = pd.read_excel(cur_file)
        dfnew = pd.read_excel(new_file)
        
        # 此处写入你原本的两表差异比对、信息更新逻辑
        # 示例:输出差异行数
        diff_df = dfcur.merge(dfnew, how='outer', indicator=True)
        diff_count = len(diff_df.loc[lambda x: x['_merge'] != 'both'])
        result = f"两表共检测到 {diff_count} 条差异数据"
        # 如果需要展示表格,可直接调用DataFrame的to_html()方法
        # result = diff_df.to_html()
        
        return render_template('upload.html', result=result)
        
    return render_template('upload.html')

if __name__ == '__main__':
    app.run(debug=True)

核心逻辑说明

  • 合并独立表单为同一个,确保单次POST请求可以同时携带两个文件数据
  • 前后端双重校验避免非法提交,降低服务端出错概率
  • 只有两个文件都通过校验后才会执行pandas处理逻辑,符合两文件全部上传完成再运算的需求

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 10:24:08