Thom
Thom

Reputation: 1623

Django unique filename method

I am looking for the method Django uses to generate unique filename when we upload a file.

For example, if I upload a file called test.csv twice in the same directory, the first one will be saved as test.csv and the second file will be saved as test_2.csv. I already tried to find how Django manages that, but I only found django.utils.text.get_valid_filename which could be useful, but that not what I am looking for...

I already saw other topics with random naming solution, that not what I am looking for here :) I really trying to understand how Django manage that problem.

Upvotes: 4

Views: 1722

Answers (3)

Marc-Olivier Titeux
Marc-Olivier Titeux

Reputation: 1317

Actually, you were on the right track.

From the docs,

Internally, Django uses a django.core.files.File instance any time it needs to represent a file.

And also,

Behind the scenes, Django delegates decisions about how and where to store files to a file storage system

Which means that, when the file is uploaded, using the default storage (FileSystemStorage), Django delegates the naming (or the available name), behind the scene, for the file to the storage, which then uses: get_available_name(name).

So, If you want to change the way files are named when uploaded, you need to add a custom file storage, which would basically only override get_available_name. The documentation on the matter is here.

Upvotes: 1

Thom
Thom

Reputation: 1623

I actually take a closer look with your help and a found something :)

So basically I have to do something like:

from django.core.files.storage import FileSystemStorage

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

Thank you all :)

PS: If you are interesting, the comment from django.core.file.storage.FileSystemStorage._save says:

There's a potential race condition between get_available_name and saving the file; it's possible that two threads might return the same name, at which point all sorts of fun happens. So we need to try to create the file, but if it already exists we have to go back to get_available_name() and try again.

Upvotes: 6

Anurag
Anurag

Reputation: 3114

If you see the implementation of class django.core.files.storage.Storage you will know how Django 1.6 manages the file names.

Look into the save method of this class. In this the line

name = self.get_available_name(name)

is doing the trick.

This is the default implementation of getting the new file name before saving the file. If you want to write your own version (like the file should be overridden) then consider writing your own custom storage system

Upvotes: 2

Related Questions