Python 使用Flask上载文件时,应如何处理重复的文件名

Python 使用Flask上载文件时,应如何处理重复的文件名,python,flask,Python,Flask,我最近遇到了关于Flask文件上传的问题和答案 在我再次上传同名图片之前,这一切都很顺利。它没有改变图像或覆盖它 我这里的问题是,如果用户上传了一个同名的图像,我们有没有办法显示一条错误消息,或者自动将名称更改为其他名称 对于自动更改名称,我进行了研究,可以通过resolve\u conflict来完成,但我不知道如何实现它 我的代码与参考代码相同 在保存文件之前,需要创建某种uniuqe ID以附加到文件名 这可以通过以下方法实现: from uuid import uuid4 def mak

我最近遇到了关于Flask文件上传的问题和答案

在我再次上传同名图片之前,这一切都很顺利。它没有改变图像或覆盖它

我这里的问题是,如果用户上传了一个同名的图像,我们有没有办法显示一条错误消息,或者自动将名称更改为其他名称

对于自动更改名称,我进行了研究,可以通过resolve\u conflict来完成,但我不知道如何实现它

我的代码与参考代码相同

在保存文件之前,需要创建某种uniuqe ID以附加到文件名

这可以通过以下方法实现:

from uuid import uuid4
def make_unique(string):
    ident = uuid4().__str__()[:8]
    return f"{ident}-{string}"
可用于向字符串开头添加8个随机字符:

>>> make_unique('something.txt')
'aa659bb8-something.txt'
要在上载代码中使用此选项,只需在保存之前通过该函数运行文件名。请确保首先通过
安全\u filename
功能输入文件名,不过:

        if file and allowed_file(file.filename):
            original_filename = secure_filename(file.filename)
            unique_filename = make_unique(original_filename)
            file.save(os.path.join(app.config['UPLOAD_FOLDER'], unique_filename))

虽然这是为了避免重复,但在更大的应用程序中,您可能希望扩展这种方法

如果在数据库中存储
original_filename
unique_filename
的值,则允许您在下载路径中执行以下操作:

from flask import send_file
# ...
f = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename)
send_file(f, attachment_filename=original_filename)
这样做的好处是,文件以唯一标识符存储在服务器上,但用户永远不会知道这一点,因为文件将以最初上载的文件名返回给他们

实际上,您可能希望更进一步,只需使用完整的uuid字符串保存文件;将第三行更改为:

unique_filename = uuid4().__str__()

这仍将为文件提供正确的mimetype,因为
send\u file
根据提供的
attachment\u文件名猜测mimetype。对于较长的答案,请遵循适当问题的规则。解决方案不需要只编写代码,但您的问题也必须包含一些内容。@HenryHarutyunyan抱歉,我是新来的,我不想重复它。这就是为什么我给了你一份推荐信。请帮助,如果我看到,但仍然需要显示一些工作完成。你如何使用它?提到其他问题是可以的,但是你需要展示你做了什么,你有什么问题。如果可能的话,请在这里发布上传图像的部分代码。一个选项是使用
os.path.exists(os.path.join(app.config['UPLOAD\u FOLDER'],filename))
,但同样,idk是您需要放置它的地方,因为您没有任何实现细节。@HenryHarutyunyan我的代码作为参考也是一样的