我想上传图片,如果文件存在,在不改变文件名的情况下覆盖它。它已经可以覆盖文件,但django总是在文件名的末尾添加随机字符。我如何用相同的文件名覆盖?这里是我的代码。
foto_content_url = models.ImageField(null=True, blank=True, upload_to=foto_path)
个字符
qqrboqgw1#
我如何用相同的文件名覆盖?请不要这样做。这样做有一个很好的理由:你不能提前知道其他模型对象是否引用了(旧的)文件。如果你用新的内容覆盖它,那么所有引用旧文件的记录都会引用新文件。也许现在,这种情况是不可能的,或者是非常不可能的,但是随着应用程序的增长,最终可能会引入引用同一文件的FileField s或ImageField s的其他模型。这也是一个安全漏洞:如果某人将上载新文档并且某人有权访问旧文档,则他们现在有权访问新文档,这可能不是预期的效果。如果你真的想这样做,你可以检查文件是否已经存在,并在这种情况下删除它:
FileField
ImageField
import os import os.path from django.conf import settings # bad idea def foto_path(instance, filename): filename = f'/{filename}.jpg' try: os.remove(os.path.join(settings.MEDIA_ROOT, filename)) except FileNotFoundError: pass return filename
字符串
1条答案
按热度按时间qqrboqgw1#
我如何用相同的文件名覆盖?
请不要这样做。这样做有一个很好的理由:你不能提前知道其他模型对象是否引用了(旧的)文件。如果你用新的内容覆盖它,那么所有引用旧文件的记录都会引用新文件。
也许现在,这种情况是不可能的,或者是非常不可能的,但是随着应用程序的增长,最终可能会引入引用同一文件的
FileField
s或ImageField
s的其他模型。这也是一个安全漏洞:如果某人将上载新文档并且某人有权访问旧文档,则他们现在有权访问新文档,这可能不是预期的效果。如果你真的想这样做,你可以检查文件是否已经存在,并在这种情况下删除它:
字符串