我最近遇到了这个关于 Flask 文件上传的问题和答案/sf/answers/3144859021/。
这工作得很好,直到我再次上传同名的图像。它没有改变图像或覆盖它。
我的问题是,如果用户上传同名图像,我们是否可以显示错误消息或自动将名称更改为其他名称。
对于自动更改名称,我研究过,可以通过resolve_conflict来完成,但我不明白如何实现它。
我的代码同上作为参考
在保存文件之前,您需要创建某种 uniuqe ID 以附加到文件名。
这可以通过以下方式完成:
from uuid import uuid4
def make_unique(string):
ident = uuid4().__str__()
return f"{ident}-{string}"
Run Code Online (Sandbox Code Playgroud)
这会在字符串的开头添加一个唯一的 UUID:
>>> make_unique('something.txt')
'f374b80c-b09e-468f-adc6-3d9df175cee7-something.txt'
Run Code Online (Sandbox Code Playgroud)
要在上传代码中使用此功能,只需在保存之前通过该函数运行文件名即可。但请务必先将文件名放入函数中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))
Run Code Online (Sandbox Code Playgroud)
尽管这可以避免重复,但在较大的应用程序中您可能希望扩展此方法。
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)
Run Code Online (Sandbox Code Playgroud)
这样做的优点是文件以唯一标识符存储在您的服务器上,但用户永远不会知道这一点,因为文件会以最初上传的文件名返回给他们。
事实上,您可能希望更进一步,只需使用 UUID 字符串将文件保存在您的一端,而不是附加文件名;不要使用make_unique上面的函数,请将第三行更改为:
unique_filename = uuid4().__str__()
Run Code Online (Sandbox Code Playgroud)
这仍然会为文件提供正确的 mimetype,因为send_file根据提供的 猜测 mimetype attachment_filename。
| 归档时间: |
|
| 查看次数: |
1890 次 |
| 最近记录: |