webentwicklung-frage-antwort-db.com.de

Wie ändere ich den Dateinamen einer hochgeladenen Datei in Django?

Ist es möglich, den Dateinamen einer hochgeladenen Datei in Django zu ändern? Ich habe gesucht, aber keine Antwort gefunden.

Meine Anforderung ist, dass der Dateiname einer hochgeladenen Datei im folgenden Format geändert werden muss.

format = userid + transaction_uuid + file_extension

Vielen Dank...

27

Wie lädst du die Datei hoch? Ich nehme mit der FileField an.

In der Dokumentation zu FileField.upload_to steht, dass das Feld upload_to

es kann sich auch um eine aufrufbare Funktion handeln, die aufgerufen wird, um den Upload-Pfad einschließlich des Dateinamens abzurufen. Dieser Callable muss in der Lage sein, zwei Argumente zu akzeptieren und einen Pfad im Unix-Stil (mit Schrägstrichen) zurückzugeben, der an das Speichersystem weitergeleitet wird. Die beiden Argumente, die übergeben werden, sind:

" instance ": Eine Instanz des Modells, in dem die FileField definiert ist. Dies ist insbesondere der Fall, in dem die aktuelle Datei angehängt wird.

" Dateiname ": Der Dateiname, der der Datei ursprünglich zugewiesen wurde. Dies kann bei der Bestimmung des endgültigen Zielpfads berücksichtigt werden oder nicht.

Es sieht also so aus, als müssten Sie nur eine Funktion erstellen, um Ihren Namen zu bearbeiten und den Pfad zurückzugeben.

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

Sie benötigen eine FileField mit dem upload_to, der einen Rückruf aufruft, siehe [1].

Ihr Rückruf sollte eine Wrapper-Methode aufrufen, die eine Instanz als einen der Parameter und einen Dateinamen als den anderen erhält. [2]

Ändere es nach deinen Wünschen und gib den neuen Pfad zurück. [3]

1. LOGIK

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

2. Methode definieren

def method_call(params):
    return u'abc'

3. Wrapper:

def wrapper(instance, filename):
    return method

dies ist die Rapper-Methode, die Sie zum Abrufen der Instanz benötigen.

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

Code vervollständigen

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

Aufruf der Methode

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

Hoffe das hilft. Vielen Dank.

6
Clayton

wenn Sie möchten, dass Ihre Funktion wiederverwendbar ist:

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)

Sie müssen es nur so verwenden:

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

Der grundlegende Weg ist

import os

os.rename('a.txt', 'b.html')

Für Ihre Situation würde es wahrscheinlich so aussehen

os.rename ("a.txt", "{id}{uuid}.{ext}".format(id=userid, uuid=transaction_uuid, ext=file_extension))
0
Bárbara Este