如何使用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
相关产品推荐
相关产品推荐

