Подтвердить что ты не робот

В django изменение имени файла загруженного файла

Можно ли изменить имя файла загруженного файла в django? Я искал, но не нашел ответа.

Мое требование - всякий раз, когда файл загружается, его имя файла должно быть изменено в следующем формате.

format = userid + transaction_uuid + file_extension

Большое спасибо...

4b9b3361

Ответ 1

Как вы загружаете файл? Я предполагаю с FileField.

Документация для FileField.upload_to говорит, что поле upload_to,

также может быть вызываемым, например, функции, которая будет вызвана получить путь загрузки, включая имя файла. Этот вызываемый должен быть способен принять два аргумента и вернуть Путь в стиле Unix (с косой чертой) проходить вместе с хранилищем система. Два аргумента, которые будут:

" экземпляр": экземпляр модель, где FileFieldопределены. В частности, это конкретный случай, когда текущий файл прикрепляется.

" имя_файла": имя файла, которое было первоначально предоставленный файлу. Это может или не могут быть приняты во внимание, когда определение конечного пункта назначения путь.

Итак, похоже, вам просто нужно сделать функцию для обработки имен и возврата пути.

def update_filename(instance, filename):
    path = "upload/path/"
    format = instance.userid + instance.transaction_uuid + instance.file_extension
    return os.path.join(path, format)

Ответ 2

Вам нужно иметь FileField с upload_to, который вызывает обратный вызов, см. [1]

Обратный вызов должен вызывать метод-оболочку, который получает экземпляр как один из параметров и имя файла, как другой. [2]

Измените его так, как вам нравится, и верните новый путь [3]

1. LOGIC

FileField(..., upload_to=method_call(params),....)

2. определить метод

def method_call(params):
    return u'abc'

3. Упаковочный:

def wrapper(instance, filename):
    return method

Это метод рэпера, который вам нужен для получения экземпляра.

def wrapper(instance, filename):
... Your logic
...
return wrapper

Полный код

def path_and_rename(path, prefix):
    def wrapper(instance, filename):
        ext = filename.split('.')[-1]
        project = "pid_%s" % (instance.project.id,)
        # get filename
        if instance.pk:
            complaint_id = "cid_%s" % (instance.pk,)
            filename = '{}.{}.{}.{}'.format(prefix, project, complaint_id, ext)
        else:
            # set filename as random string
            random_id = "rid_%s" % (uuid4().hex,)
            filename = '{}.{}.{}.{}'.format(prefix, project, random_id, ext)
            # return the whole path to the file
        return os.path.join(path, filename)

    return wrapper

Вызов метода

sales_attach = models.FileField("Attachment", upload_to=path_and_rename("complaint_files", 'sales'), max_length=500,
                                help_text="Browse a file")

Надеюсь, это поможет. Спасибо.

Ответ 3

если вы хотите, чтобы ваша функция повторно использовалась:

import hashlib
import datetime
import os
from functools import partial

def _update_filename(instance, filename, path):
    path = path

    filename = "..."

    return os.path.join(path, filename)

def upload_to(path):
    return partial(_update_filename, path=path)

Вам просто нужно использовать его следующим образом:

document = models.FileField(upload_to=upload_to("my/path"))