【问题标题】:How should I handle duplicate filenames when uploading a file with Flask使用 Flask 上传文件时,我应该如何处理重复的文件名
【发布时间】:2020-08-15 10:39:06
【问题描述】:

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

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

我的问题是,如果用户上传了同名的图片,我们有什么办法可以显示错误消息或自动将名称更改为其他名称。

对于自动更改名称,我研究过,可以通过 resolve_conflict 完成,但我不明白如何实现。

【问题讨论】:

  • 嘿那里:D 是简短的。对于更长的答案,请遵循正确问题的规则。这不是只需要代码的解决方案,但您的问题也必须包含一些。
  • @HenryHarutyunyan 对不起,我是新来的,我不想复制它。所以这就是为什么提供参考。可以的话请帮忙
  • 我明白了,但您仍然需要展示一些已完成的工作。你如何使用它?可以参考其他问题,但是你需要展示你做了什么,你有什么问题。如果可能,请在此处发布上传图片的部分代码。
  • 一种选择是使用os.path.exists(os.path.join(app.config['UPLOAD_FOLDER'], filename)),但同样,idk 你需要把它放在哪里,因为你没有任何实现细节。
  • @HenryHarutyunyan 我的代码同上作为参考

标签: python flask


【解决方案1】:

我的代码同上作为参考

在保存文件之前,您需要创建某种 uniuqe 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。

【讨论】:

猜你喜欢
  • 2015-02-08
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-08
相关资源
最近更新 更多