Django 使用验证防止上载重复的文件名
我如何检测用户提供用于上传的文件(通过Django 使用验证防止上载重复的文件名,django,django-forms,Django,Django Forms,我如何检测用户提供用于上传的文件(通过django.forms.ModelForm使用FileField字段)的名称是否与现有文件重复,从而决定表单验证失败 我发现这一点特别具有挑战性,因为在表单中,我不知道如何找出上传到文件字段的值,因此我无法在文件系统中查看该文件是否已经存在。在我看来,您有两个选项: 在中设置一个值以保存“upload_to”,然后在验证时使用该值进行检查。 类似这样的验证方法会起作用(您需要将您的上传更改为ofc): 问题是你不能有子文件夹或任何复杂的东西 第二个选项是,
django.forms.ModelForm
使用FileField
字段)的名称是否与现有文件重复,从而决定表单验证失败
我发现这一点特别具有挑战性,因为在表单中,我不知道如何找出
上传到文件字段的值,因此我无法在文件系统中查看该文件是否已经存在。在我看来,您有两个选项:
在中设置一个值以保存“upload_to”,然后在验证时使用该值进行检查。
类似这样的验证方法会起作用(您需要将您的上传更改为ofc):
问题是你不能有子文件夹或任何复杂的东西
第二个选项是,正如您在评论中提到的,向模型中添加一个新列,该列包含文件的哈希。这种方法应该更有效。正如有人在您的评论中提到的,为了避免上传大文件、检查、失败、上传另一个大文件等,您可以尝试在客户端对其进行散列,并首先通过ajax进行验证(您将在服务器上再次验证,但这会让您的用户更快) 以前的问题,但Django 1.11现在支持FileField上的unique
选项。在模型的字段声明中设置unique=True
您将upload_设置为什么并不重要。文件名仍将存储在数据库中
在Django 1.11中更改:
在旧版本中,无法在FileField上使用unique=True
注意:我想防止重复的文件以不同的名称上传,这是django在我不检查时会做的。也许是像md5这样的校验和,@madzohan谢谢,对吧-这样有助于确定文件是否相同,一旦我有两个文件要比较,但是,我如何确定文件系统中是否已经存在表单中的名称将首先覆盖的文件?使用新列校验和
创建数据迁移,我认为您不需要随表单提交该文件,更好的是,当输入发生变化时,运行ajax到您必须比较的某个视图。。。还有类似的事情我能澄清一下吗?为文件设置哈希(AIUI)是检测文件内容是否相同的一种方法。但我的问题是“更简单”。。。我只需要检测用户是否正在尝试上载与已上载文件同名的文件。我确实在upload_to中有子文件夹:upload_to是一个可调用的函数,它按上载者名称将文件放入子文件夹中。现在,我不担心上传一个大文件后失败——只要我能防止重复上传。所以,保持简单。将文件名放在新列中(我想它会被添加到用户模型中,类似于用户文件),用逗号分隔,然后在验证中进行比较。我是否需要显式搜索,类似于if thingoos.objects.get(file\u name=this\u file\u nane):引发验证错误()
?检查文档中的验证错误(),除此之外,它应该会起作用。开始看起来简单、有希望。有没有一种方法可以问“是否有任何东西是谁的文件\u attachment.name==这个文件\u name?”从而避免额外的列重复文件名?
from django.conf import settings
if settings.UPLOAD_TO:
# Do something