使用Flask上传文件时,我应该如何处理重复的文件名



我最近遇到了这个问题和答案https://stackoverflow.com/a/44926557/12322095关于Flask文件上传。

这非常好,直到我再次上传了一张同名的图片。它没有改变图像或覆盖图像。

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

对于自动更改名称,我进行了研究,可以通过resolve_conflict完成,但我不知道如何实现。

我的代码与引用相同

在保存文件之前,您需要创建某种uniuque ID来附加到文件名。

这可以通过以下方式完成:

from uuid import uuid4
def make_unique(string):
ident = uuid4().__str__()
return f"{ident}-{string}"

它在字符串的开头添加了一个唯一的UUID:

>>> make_unique('something.txt')
'f374b80c-b09e-468f-adc6-3d9df175cee7-something.txt'

要在上传代码中使用它,只需在保存之前通过该函数运行文件名即可。请确保首先通过secure_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_filenameunique_filename的值存储在数据库中,则可以在下载路径中执行以下操作:

from flask import send_file
# ...
f = os.path.join(app.config['UPLOAD_FOLDER'], unique_filename)
send_file(f, attachment_filename=original_filename)

这样做的好处是,文件用唯一的标识符存储在服务器上,但用户永远不会知道这一点,因为文件会用最初上传的文件名返回给他们。

事实上,您可能希望更进一步,只需使用UUID字符串将文件保存在您的端部,而不是附加文件名;不要使用上面的make_unique函数,将第三行更改为:

unique_filename = uuid4().__str__()

这仍然会为文件提供正确的mimetype,因为send_file根据提供的attachment_filename猜测mimetype。

最新更新