nom - python supprimer fichier




En django changer le nom de fichier d'un fichier téléchargé (2)

Comment téléchargez-vous le fichier? Je suppose avec le FileField .

La documentation de FileField.upload_to indique que le champ upload_to ,

peut également être appelable, par exemple une fonction, qui sera appelée pour obtenir le chemin de téléchargement, y compris le nom de fichier. Cet appelable doit pouvoir accepter deux arguments et renvoyer un chemin de style Unix (avec des barres obliques) au système de stockage. Les deux arguments qui seront passés sont les suivants:

" instance ": instance du modèle dans lequel FileField est défini. Plus précisément, il s'agit de l'instance particulière à laquelle le fichier en cours est attaché.

" filename ": le nom de fichier qui a été initialement donné au fichier. Cela peut ou non être pris en compte lors de la détermination du chemin de destination final.

Il semble donc que vous ayez juste besoin de faire une fonction pour gérer votre nom et retourner le chemin.

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

Est-il possible de changer le nom de fichier d'un fichier téléchargé dans django? J'ai cherché, mais n'ai pas trouvé de réponse.

Mon exigence est que chaque fois qu'un fichier est téléchargé, son nom de fichier doit être modifié dans le format suivant.

format = userid + transaction_uuid + file_extension

Merci beaucoup...


Vous devez avoir un FileField avec le upload_to qui appelle un callback, voir [1]

Votre rappel doit appeler une méthode wrapper qui obtient une instance comme l'un des paramètres et le nom du fichier comme l'autre. [2]

Changez-le comme vous voulez et retournez le nouveau chemin [3]

1. LOGIQUE

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

2. définir la méthode

def method_call(params):
    return u'abc'

3. Emballage:

def wrapper(instance, filename):
    return method

C'est la méthode de rapper dont vous avez besoin pour obtenir l'instance.

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

Code complet

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

Appel à la méthode

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

J'espère que cela t'aides. Merci.





django-views