使用django强制唯一的上传文件名?

使用django上传服务器上的唯一文件名的最佳方法是什么? 我想确保每个名字只使用一次。 有没有任何pinax应用程序可以做到这一点,也许与GUID?

使用uuid。 为了将其绑定到您的模型,请参阅FileField upload_to的Django文档 。

例如在你的models.py中定义下面的函数:

import uuid import os def get_file_path(instance, filename): ext = filename.split('.')[-1] filename = "%s.%s" % (uuid.uuid4(), ext) return os.path.join('uploads/logos', filename) 

然后,在定义FileField / ImageField时,请指定get_file_path作为upload_to值。

 file = models.FileField(upload_to=get_file_path, null=True, blank=True, verbose_name=_(u'Contact list')) 

在Django get_avaialable_name和1.4.14之前, get_avaialable_name函数会通过添加一个下划线自动给文件一个唯一的名字。 因此,例如,如果您将一个文件“test.jpg”和另一个文件“test.jpg”保存到服务器,则第一个文件将被称为test.jpg,第二个文件将被称为test_1.jpg。

唉,事实certificate,这是一个DDOSing机器的载体,通过发送数以千计的零字节文件来存储,每一个检查成千上万的以前的文件,看看它的名字应该是什么。

正如你将在文档中看到的 ,新系统在下划线之后附加7个随机数字来解决这个问题。

更好的方法是在你的helpers.py中使用一个普通的类。 这样你可以在应用程序中重复使用随机文件生成器。

在你的helpers.py中:

 import os import uuid from django.utils.deconstruct import deconstructible @deconstructible class RandomFileName(object): def __init__(self, path): self.path = os.path.join(path, "%s%s") def __call__(self, _, filename): # @note It's up to the validators to check if it's the correct file type in name or if one even exist. extension = os.path.splitext(filename)[1] return self.path % (uuid.uuid4(), extension) 

然后在你的模型中,只需要导入辅助类:

 from mymodule.helpers import RandomFileName 

然后使用它:

 logo = models.ImageField(upload_to=RandomFileName('logos')) 

参考: https : //coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites

将文件名与照片上传date/时间连接起来,然后用hashlib创build一个消息摘要? 这应该给你独特的文件名。

或者,您可以重新使用一个整洁的小片段 ,创build独特的文件名,然后使用该文件的完整path作为您的哈希调用的input。 这给你独特的恒定长度的string,你可以映射到你的文件。

至于写这个答案,似乎你不再需要做任何特别的事情来做到这一点。 如果您设置了一个带有静态upload_to属性的FileField,Django存储系统将自动pipe理命名,以便上传重复的文件名时,Django会为这个重复生成一个新的唯一文件名。

适用于Django 1.10。