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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 12:05:21