Enforce unique upload file names using django?

后端 未结 7 2040
别跟我提以往
别跟我提以往 2020-11-28 23:03

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

相关标签:
7条回答
  • 2020-11-28 23:08

    How about concatenating the filename with the date / time the photo was uploaded and then using hashlib to create a message digest? That should give you unique filenames.

    Alternatively you could re-use a neat little snippet which creates unique filenames and then use the full path to that file as the input to your hash call. That gives you unique constant length strings which you can map to your files.

    0 讨论(0)
  • 2020-11-28 23:08

    You can write your own FileField and over write generate_filename.

    For example:

    class UniqueNameFileField(FileField):
        def generate_filename(self, instance, filename):
            _, ext = os.path.splitext(filename) 
            name = f'{uuid.uuid4().hex}{ext}'
            return super().generate_filename(instance, name)
    
    0 讨论(0)
  • 2020-11-28 23:17

    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,
                            null=True,
                            blank=True,
                            verbose_name=_(u'Contact list'))
    
    0 讨论(0)
  • 2020-11-28 23:21

    As of the writing of this answer it seems like you no longer need to do anything special to make this happen. If you set up a FileField with a static upload_to property, the Django storage system will automatically manage naming so that if a duplicate filename is uploaded, Django will randomly generate a new unique filename for the duplicate.

    Works on Django 1.10.

    0 讨论(0)
  • 2020-11-28 23:30

    django enforce unique filename automatically. if the file already exists, seven unique characters are appended to the filename

    tested on django 2.2

    0 讨论(0)
  • 2020-11-28 23:33

    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
    
    
    @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

    0 讨论(0)
提交回复
热议问题