Enforce unique upload file names using django?


What's the best way to rename photos with a unique filename on the server as they are uploaded, using django? I want to make sure each name is used only once. Are there any pinax apps that can do this, perhaps with GUID?

4/21/2010 4:58:45 AM

Accepted Answer

Use uuid. To tie that into your model see Django documentation for FileField upload_to.

For example in your models.py define the following function:

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)

Then, when defining your FileField/ImageField, specify get_file_path as the upload_to value.

file = models.FileField(upload_to=get_file_path,
                        verbose_name=_(u'Contact list'))
1/18/2014 5:09:41 AM

A better way could be using a common class in your helpers.py. This way you could reuse the random file generator across your apps.

In your helpers.py:

import os
import uuid
from django.utils.deconstruct import 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)

And then in your model just import the helper class:

from mymodule.helpers import RandomFileName 

And then use it:

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

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

Licensed under: CC-BY-SA with attribution
Not affiliated with: Stack Overflow