Django唯一的文件名方法

时间:2014-02-25 09:37:11

标签: python django filenames

我正在寻找Django在上传文件时用来生成唯一文件名的方法。

例如,如果我在同一目录中两次上传名为test.csv的文件,则第一个文件将保存为test.csv,第二个文件将另存为test_2.csv。我已经试图找到Django如何管理它,但我发现django.utils.text.get_valid_filename可能有用,但这不是我想要的......

我已经看到了other topics随机命名解决方案,这不是我在这里寻找的:)我真的想了解Django如何解决这个问题。

3 个答案:

答案 0 :(得分:4)

我实际上是在你的帮助下仔细研究并发现了一些东西:)

所以基本上我必须做一些事情:

from django.core.files.storage import FileSystemStorage

fss = FileSystemStorage()
filepath = fss.get_available_name(filepath)

谢谢大家:)

PS:如果您感兴趣,django.core.file.storage.FileSystemStorage._save的评论说:

  

get_available_name和。之间存在潜在的竞争条件   保存文件;两个线程可能会返回   同名,此时会发生各种各样的乐趣。所以我们需要   尝试创建文件,但如果它已经存在,我们必须返回   到get_available_name()并再试一次。

答案 1 :(得分:2)

如果您看到类django.core.files.storage.Storage的实现,您将知道Django 1.6如何管理文件名。

查看此类的save方法。在这一行

name = self.get_available_name(name)

正在做这个伎俩。

这是在保存文件之前获取新文件名的默认实现。如果你想编写自己的版本(比如文件应该被覆盖),那么考虑编写自己的custom storage system

答案 2 :(得分:1)

实际上,你走在了正确的轨道上。

来自docs

  

在内部,Django随时都使用django.core.files.File实例   需要代表一个文件。

而且,

  

在幕后,Django代表决定如何以及在何处进行   将文件存储到文件存储系统

这意味着,当文件上传时,使用默认存储(FileSystemStorage),Django将文件后面的命名(或可用名称)委托给存储,然后使用:get_available_name(name)

因此,如果要更改上载时文件的命名方式,则需要添加自定义文件存储,这基本上只会覆盖get_available_name。关于此事的文件是here