Flask表单上传文件:如何实现计数并分配连续编号
Flask表单上传文件的连续编号与数量统计
需求说明
需要实现:统计通过表单上传的所有文件数量,为每个上传文件分配连续的三位数字编号,命名格式为LOT_image_001、LOT_image_002……以此类推。
原代码问题分析
当前代码中的counter是局部变量,每次请求都会重置为0,无法实现连续计数;且命名逻辑不符合要求,只是在原文件名前加了LOT_,没有生成连续编号。另外代码缺少os模块的导入,运行会报错。
解决方案
通过扫描上传目录中已有的目标格式文件生成下一个连续编号,这种方式无需额外存储计数,更可靠且避免了持久化计数的锁问题。
修改后的Python代码
from flask import Flask, render_template, request from werkzeug.utils import secure_filename import os app = Flask(__name__) app.config['UPLOAD_FOLDER'] = './Files PDF' # 确保上传目录存在,避免首次上传报错 os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True) @app.route("/") def upload_file(): return render_template('form.html') @app.route("/upload", methods=['POST']) def uploader(): if request.method == 'POST': # 扫描上传目录,统计符合命名规则的文件数量 upload_dir = app.config['UPLOAD_FOLDER'] existing_files = [f for f in os.listdir(upload_dir) if f.startswith('LOT_image_')] # 生成下一个连续编号,格式化为三位数字(自动补零) next_num = len(existing_files) + 1 new_filename = f"LOT_image_{next_num:03d}" # 获取上传文件,可选择保留原文件后缀 f = request.files['file'] file_ext = os.path.splitext(secure_filename(f.filename))[1] # 若需保留原格式,启用下面一行;否则直接用new_filename保存 # new_filename_with_ext = f"{new_filename}{file_ext}" # f.save(os.path.join(upload_dir, new_filename_with_ext)) # 直接按编号命名保存文件 f.save(os.path.join(upload_dir, new_filename)) # 可选:返回当前已上传文件总数到页面 total_count = len(existing_files) + 1 return render_template('form.html', total_count=total_count) if __name__ == '__main__': app.run("0.0.0.0",8000,threaded=True,debug=True)
修改后的form.html(支持显示上传总数)
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>File Upload</title> </head> <body> {% if total_count %} <p>已上传文件总数:{{ total_count }}</p> {% endif %} <form action="/upload" method="POST" enctype="multipart/form-data"> <input type="file" name="file" required> <input type="submit" value="上传文件"> </form> </body> </html>
关键说明
- 目录初始化:用
os.makedirs确保上传目录存在,避免首次上传时的路径不存在错误。 - 编号生成逻辑:筛选目录中以
LOT_image_开头的文件,统计数量后加1得到下一个编号,用{next_num:03d}格式化为三位数字(自动补零)。 - 命名灵活性:代码提供两种命名方式——保留原文件后缀或直接用编号命名,可根据需求切换。
- 并发处理提示:高并发场景下可能出现编号重复,可通过文件锁或数据库存储计数解决,小流量应用无需额外处理。
内容的提问来源于stack exchange,提问作者Loric
相关产品推荐
相关产品推荐

