Создание уникальных имен файлов с помощью метки времени в загрузках изображений django - PullRequest
0 голосов
/ 22 апреля 2019

Введение: У меня есть небольшой фрагмент кода, который берет любое добавляемое изображение, уменьшает его и сохраняет.Для этого я использую внешнюю библиотеку Filepond .

Проблема: Если 2 пользователя добавляют одинаковые имена к своим изображениям (разные изображения).Изображение второго пользователя заменяет изображение первого пользователя, и оба пользователя видят одно и то же изображение.

Что я хочу: Добавить уникальные имена изображений.Мои попытки ниже настоящего кода.Мне нужно лучшее решение для этого, чтобы имена были не слишком большими, но уникальными

Настоящий код:

fields.py:

class FilePondField(forms.FileField):
widget = forms.TextInput(attrs={'class': 'fileid'})

def __init__(self, name, *args, **kwargs):
    super(FilePondField, self).__init__(*args, **kwargs)
    self.name = name

def prepare_value(self, data):
    if not data:
        return None

    if isinstance(data, str):
        try:
            tu = TU.objects.get(upload_id=data)
        except TU.DoesNotExist:
            return None
        return tu.upload_id

    name = data.name
    base = os.path.basename(name)
    file_id = "%s_%s" % (self.name, data.instance.pk)
    try:
        tu = TU.objects.get(file_id=file_id)
    except TU.DoesNotExist:
        upload_id = uuid()
        tu = TU(upload_id=upload_id, file_id=file_id,  # uuid(),
                upload_name=base, upload_type=TU.FILE_DATA)
        try:
            with data.storage.open(name, 'rb') as f:
                rd_data = File(f)
                tu.file.save(tu.file_id, rd_data, True)
            tu.save()
        except:
            pass

    return tu.upload_id

def clean(self, data, initial=None):
    self.initial = initial
    if not data:
        if self.required:
            raise ValidationError(self.error_messages['required'], code='required')
        return None
    return data

def save_cb(self, instance, modfld, tu):
    prename = os.path.join(modfld.upload_to, tu.upload_name)
    ffile = ImageFieldFile(instance, modfld, prename)

    try:
        with open(tu.get_file_path(), 'rb') as f:
            data = File(f)
            ffile.save(tu.upload_name, data, False)
    except:
        pass
    return ffile

def do_tmp(self, instance, modfld, value, cb):
    try:
        tu = TU.objects.get(upload_id=value)
        ffile = cb(instance, modfld, tu) if cb else None
    except TU.DoesNotExist:
        ffile = None
    else:
        tu.delete()

    file_id = "%s_%s" % (self.name, instance.pk)
    try:
        ogtu = TU.objects.get(file_id=file_id)
    except TU.DoesNotExist:
        pass
    else:
        ogtu.delete()

    return ffile

def save(self, instance, modfld, value):
    return self.do_tmp(instance, modfld, value, self.save_cb)

def del_tmp(self, instance, modfld, value):
    self.do_tmp(instance, modfld, value, None)

def bound_data(self, data, initial):
    return data

def has_changed(self, initial, data):
    if not initial:
        return data
    return initial != data

forms.py

class ImageForm(forms.ModelForm):
img_fields = []

def __init__(self, *args, **kwargs):
    super(ImageForm, self).__init__(*args, **kwargs)
    for (fld, fargs) in self.img_fields:
        self.fields[fld] = FilePondField(fld, **fargs)

def save(self, *args, **kwargs):
    commit = kwargs.get('commit', True)
    for (fld_nm, fargs) in self.img_fields:
        fld = dict([(f.name, f) for f in self._meta.model._meta.fields])[fld_nm]
        if isinstance(self.fields[fld_nm], FilePondField):
            self.fields[fld_nm] = self.fields[fld_nm].save(self.instance, fld, self.cleaned_data[fld_nm])

    return super(ImageForm, self).save(*args, **kwargs)

def del_tmp (self):
    for (fld_nm, fargs) in self.img_fields:
        fld = dict([(f.name, f) for f in self._meta.model._meta.fields])[fld_nm]
        if isinstance(self.fields[fld_nm], FilePondField):
            self.fields[fld_nm].del_tmp(self.instance, fld, self.cleaned_data[fld_nm])

Мой подход:

in fields.py Я импортирую

В функции def prepare_value(self, data): и def do_tmp(self, instance, modfld, value, cb): я делаю следующие изменения

...

file_id = "%s_%s_%s" % (self.name, data.instance.pk, datetime.datetime.now().strftime("%Y_%m_%d_%H_%M_%S_%f"))
...

Может кто-то прокомментировать это или предложить лучшую альтернативу

Ответы [ 2 ]

1 голос
/ 22 апреля 2019

Просто используйте datetime.now() значение для имени файла, как показано ниже:

from datetime import datetime
open(str(datetime.now()) + ".txt", "w+")

Результат: создается файл с именем 2019-04-22 00:21:31.862001.txt

0 голосов
/ 22 апреля 2019

сделайте имя переменной, подобной этой

name = "Your-General-Name-{}".format((int(time.time())))

, а затем поместите его в свой цикл, чтобы значение time.time () изменялось каждый раз.Вы, очевидно, не должны использовать time.time().вы можете использовать datetime.datetime.now() и т. д., но тогда вы просто замените функцию времени.

...