Flask网站中如何为每个上传文件生成唯一文件名?
生成唯一上传文件名的几种实用方案
方案1:用UUID生成唯一文件名(最推荐)
UUID是通用唯一识别码,几乎不可能重复,适合要求绝对唯一的场景。做法是用UUID生成一串唯一字符,再拼接原文件的扩展名。
修改后的代码:
import uuid import os from werkzeug.utils import secure_filename @app.route('/create', methods = ["GET", "POST"]) @login_required def create(): if request.method == "POST": file = request.files['file'] if file and allowed_file(file.filename): # 获取原文件扩展名 ext = os.path.splitext(file.filename)[1] # 生成唯一文件名:uuid + 扩展名 unique_filename = str(uuid.uuid4()) + ext # 保存文件 save_path = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename) file.save(save_path) # 这里添加数据库存储逻辑,比如假设你有Image模型 # from your_models import Image # new_image = Image(path=unique_filename) # 或存完整save_path,按需选择 # db.session.add(new_image) # db.session.commit() return render_template('create.html')
方案2:原文件名+时间戳
如果想保留原文件名的辨识度,可以在原文件名后拼接当前时间戳(精确到秒甚至毫秒),也能保证唯一性。
代码示例:
import time import os from werkzeug.utils import secure_filename @app.route('/create', methods = ["GET", "POST"]) @login_required def create(): if request.method == "POST": file = request.files['file'] if file and allowed_file(file.filename): filename = secure_filename(file.filename) # 拆分文件名和扩展名 name, ext = os.path.splitext(filename) # 拼接时间戳生成唯一文件名 unique_filename = f"{name}_{int(time.time())}{ext}" save_path = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename) file.save(save_path) # 数据库存储逻辑同上 # ... return render_template('create.html')
方案3:检查文件存在性,自动加序号
如果希望文件名尽可能贴近原文件名,当重名时自动在后面加序号(比如test.jpg→test_1.jpg→test_2.jpg),可以用循环检查文件是否存在,直到找到可用的文件名。
代码示例:
import os from werkzeug.utils import secure_filename @app.route('/create', methods = ["GET", "POST"]) @login_required def create(): if request.method == "POST": file = request.files['file'] if file and allowed_file(file.filename): filename = secure_filename(file.filename) name, ext = os.path.splitext(filename) unique_filename = filename save_path = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename) # 循环检查文件是否存在,存在则加序号 counter = 1 while os.path.exists(save_path): unique_filename = f"{name}_{counter}{ext}" save_path = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename) counter += 1 file.save(save_path) # 数据库存储逻辑同上 # ... return render_template('create.html')
注意事项
- 不管用哪种方法,一定要用
secure_filename()处理原文件名,防止恶意文件名导致路径遍历攻击。 - 数据库建议存储相对路径(比如
unique_filename),后续读取时再拼接上传文件夹路径,比存绝对路径更灵活,换服务器时不用修改数据库数据。
内容的提问来源于stack exchange,提问作者user18930222
相关产品推荐
相关产品推荐

