我正在寻找Django在上传文件时用来生成唯一文件名的方法。
例如,如果我在同一目录中两次上传名为test.csv
的文件,则第一个文件将保存为test.csv
,第二个文件将另存为test_2.csv
。我已经试图找到Django如何管理它,但我发现django.utils.text.get_valid_filename
可能有用,但这不是我想要的......
我已经看到了other topics随机命名解决方案,这不是我在这里寻找的:)我真的想了解Django如何解决这个问题。
答案 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。