2014-02-25 28 views
1

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

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

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

+1

你有没有试过自己检查Django的来源?你可以追踪那里的逻辑。 – lanzz

+0

你应该指定你正在使用哪个版本的Django。 –

+0

@ Marc-OlivierTiteux Django 1.5.5 – Thom

回答

2

我居然拿你的帮助定睛一看,发现一个东西:)

所以基本上我必须做这样的事情:

from django.core.files.storage import FileSystemStorage 

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

谢谢大家:)

PS:如果你有兴趣,从django.core.file.storage.FileSystemStorage._save评论说:

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

1

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

看看这个类的save方法。在这行

name = self.get_available_name(name) 

正在做的伎俩。

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

1

其实,你是在正确的轨道上。

docs

内部,Django使用一个django.core.files.File比如,它 需要代表文件的任何时间。

而且也

在幕后,Django的关于如何以及在哪里 存储文件的文件存储系统

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

所以,如果你想改变文件上传时的命名方式,你需要添加一个自定义文件存储,这基本上只会覆盖get_available_name。有关此事的文件是here