【问题标题】:Use validation to prevent duplicate file _name_ being uploaded使用验证来防止重复文件 _name_ 被上传
【发布时间】:2015-01-29 10:02:39
【问题描述】:

我如何检测用户提供的用于上传的文件的 名称(通过 django.forms.ModelForm 使用 FileField 字段)与存在的文件重复,因此决定在表单上验证失败?

我发现这特别具有挑战性,因为从表单中,我看不出如何找出 upload_to 的值对于这个 FileField 是什么,所以我不能自己去找文件系统查看该文件是否已经存在。

【问题讨论】:

  • 注意:我想防止以不同的名称上传重复文件,如果我不检查,django 会这样做。
  • 可能是一些校验和,例如 md5,stackoverflow.com/questions/5055143/…
  • @madzohan 谢谢,对 - 这将有助于确定文件是否相同,一旦我有两个文件要比较,但我如何找出是否存在预先存在的文件文件系统已经被表单中的名称覆盖了,首先?
  • 使用新列 checksum 创建迁移到您的数据,我认为您不需要使用表单提交该文件,最好将输入更改运行 ajax 到您必须比较的某个视图.. . 还有类似的stackoverflow.com/questions/15885201/…

标签: django django-forms


【解决方案1】:

较早的问题,但 Django 1.11 现在支持 FileField 上的 unique 选项。在模型的字段声明中设置 unique=True

您将 upload_to 设置为什么并不重要。文件名仍将存储在数据库中。

在 Django 1.11 中更改: 在旧版本中,unique=True 不能用于 FileField。

https://docs.djangoproject.com/en/1.11/ref/models/fields/#unique

【讨论】:

    【解决方案2】:

    在我看来,您有两个选择:

    在您的settings.py 中设置一个值来保存您的“upload_to”,然后使用它来检查您何时进行验证。 像这样验证的东西会起作用(你需要改变你的upload_to ofc):

    from django.conf import settings
    
    if settings.UPLOAD_TO:
        # Do something
    

    问题是你不能在那里有子文件夹或任何复杂的东西。

    第二个选项是,如您的 cmets 中所述,向您的模型添加一个新列,该列包含您的文件的哈希值。这种方法应该会更好。正如有人在您的 cmets 中提到的,为避免上传大文件,检查,失败,上传另一个大文件等,您可以尝试在客户端对其进行哈希处理,并首先通过 ajax 进行验证(您将在服务器中再次验证,但这可以使您的用户更快地进行操作)。

    【讨论】:

    • 我能澄清一下吗?拥有文件的哈希是(AIUI)检测文件内容是否相同的一种手段。但我的问题是“更简单”......我只需要检测用户是否正在尝试上传与已上传文件同名的文件。我在upload_to 中有子文件夹:upload_to 是一个可调用文件,它按上传者名称将文件放在子文件夹中。现在我不担心上传大文件后失败 - 只要我可以防止重复上传。
    • 所以,保持简单。将文件名放在新列中(我猜它会添加到用户模型中,例如 user_files),逗号分隔,然后在验证中进行比较。
    • 我是否需要明确搜索,例如 if Thingoes.objects.get(file_name = this_file_nane): raise ValidationError()
    • 检查文档是否有验证错误 (docs.djangoproject.com/en/dev/ref/forms/validation/…),除此之外它应该可以工作。
    • 开始看起来很简单,很有前途。有没有办法问“有没有什么东西是 file_attachment.name == this_file_name?”从而避免额外的列重复文件名?
    猜你喜欢
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 2016-06-21
    • 2012-10-03
    • 2022-11-22
    相关资源
    最近更新 更多