Erzwingen Sie eindeutige Upload-Dateinamen mit django?

Lesezeit: 4 Minuten

Erzwingen Sie eindeutige Upload Dateinamen mit django
zjm1126

Was ist der beste Weg, um Fotos mit einem eindeutigen Dateinamen auf dem Server umzubenennen, während sie mit django hochgeladen werden? Ich möchte sicherstellen, dass jeder Name nur einmal verwendet wird. Gibt es Pinax-Apps, die das können, vielleicht mit GUID?

  • Sie benötigen eine Python-Bibliothek zum Umbenennen von Dateien, damit sie eindeutig sind?

    – Aurri

    20. Apr. 10 um 8:42

  • 2

    Siehe Antwort von @mlissner. Dateien mit der Standardeinstellung Storage -Klasse generiert jetzt automatisch eindeutige Namen, es wird kein Benutzercode mehr benötigt. Sehen get_available_name

    – Phönix

    3. Januar ’19 um 13:16


  • Django macht das bereits standardmäßig. Benennen Sie einfach alle Ihre Bilder “image.jpg”, und ab dem zweiten werden sie automatisch mit einem Muster benannt, wie zum Beispiel: image_XpmEQxy.jpg.

    – lapin

    4. September ’19 um 3:29


Erzwingen Sie eindeutige Upload Dateinamen mit django
Nathan

Verwenden Sie UUID. Um das in Ihr Modell einzubinden, siehe Django-Dokumentation für FileField upload_to.

Definieren Sie beispielsweise in Ihrer models.py die folgende Funktion:

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)

Geben Sie dann beim Definieren Ihres FileField/ImageField get_file_path als die upload_to Wert.

file = models.FileField(upload_to=get_file_path,
                        null=True,
                        blank=True,
                        verbose_name=_(u'Contact list'))

  • 3

    Dies ist eine schlechte Entscheidung, es so zu machen, da Sie eine unendliche Migration für diese Felder haben, weil Sie bei jeder Migration einen anderen Upload-Pfad haben.

    – Andrey Nikishaev

    17. August ’15 um 16:38 Uhr

  • 10

    @Creotiv Dies ändert nicht den Upload-Pfad, sondern ersetzt den Dateinamen durch eine UUID. Dies sollte keine Migrationsprobleme verursachen.

    – Hybrid

    2. Okt ’15 um 5:02

  • @Hybrid Ja, aber bei jeder Migration ist der Verzeichnispfad anders, sodass das Migrationssystem denkt, dass sich dieses Feld geändert hat.

    – Andrey Nikishaev

    28. Okt ’15 um 20:44

  • 3

    @Creotiv – nein, Migrationen verfolgen nur wie der Dateiname wird generiert. Dies bedeutet, dass Migrationen wissen, dass es eine Funktion namens . gibt get_file_path verwendet werden. Wenn upload_to=uuid4() verwendet wurde, wäre dies dann der Fall, wenn das von Ihnen genannte Problem ins Spiel kommt.

    – orokusaki

    11. Dezember ’15 um 19:21

  • bekommen NameError: name 'get_file_path' is not defined 🙁

    – NoobEditor

    7. Juni ’16 um 11:54

Ein besserer Weg könnte die Verwendung einer gemeinsamen Klasse in Ihrer helpers.py sein. Auf diese Weise können Sie den Zufallsdateigenerator in Ihren Apps wiederverwenden.

In Ihrer 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)

Und dann importieren Sie in Ihrem Modell einfach die Hilfsklasse:

from mymodule.helpers import RandomFileName 

Und dann benutze es:

logo = models.ImageField(upload_to=RandomFileName('logos'))

Ref: https://coderwall.com/p/hfgoiw/give-imagefield-uploads-a-unique-name-to-avoid-file-overwrites

1641582776 810 Erzwingen Sie eindeutige Upload Dateinamen mit django
mlißner

Vor Django 1.6.6, 1.5.9 und 1.4.14 war die get_avaialable_name Funktion würde Dateien automatisch einen eindeutigen Namen geben, indem sie einen Unterstrich hinzufügt. Wenn Sie beispielsweise eine Datei “test.jpg” und dann eine andere Datei “test.jpg” auf Ihrem Server speichern, heißt die erste test.jpg und die zweite test_1.jpg.

Leider stellt sich heraus, dass dies ein Vektor für das DDOSing einer Maschine ist, indem ihr Tausende von Null-Byte-Dateien zum Speichern gesendet werden, wobei jede einzelne Tausende von vorherigen Dateien überprüft, um zu sehen, wie sie heißen sollen.

Wie du willst siehe in den docs, fügt das neue System sieben zufällige Ziffern nach dem Unterstrich hinzu, um dieses Problem zu beheben.

1641582776 305 Erzwingen Sie eindeutige Upload Dateinamen mit django
M. Ryan

Zum Zeitpunkt des Schreibens dieser Antwort scheint es, als ob Sie nichts Besonderes mehr tun müssen, um dies zu erreichen. Wenn Sie ein einrichten FileField mit einer statischen upload_to -Eigenschaft verwaltet das Django-Speichersystem die Benennung automatisch, sodass Django beim Hochladen eines doppelten Dateinamens zufällig einen neuen eindeutigen Dateinamen für das Duplikat generiert.

Funktioniert auf Django 1.10.

Du kannst deine eigenen schreiben FileField und überschreiben generate_filename.

Beispielsweise:

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)

1641582776 85 Erzwingen Sie eindeutige Upload Dateinamen mit django
Gemeinschaft

Wie wäre es, den Dateinamen mit dem Datum / der Uhrzeit des Hochladens des Fotos zu verketten und dann zu verwenden? hashlib einen Message Digest erstellen? Das sollte Ihnen eindeutige Dateinamen geben.

Alternativ können Sie ein nettes kleines Snippet wiederverwenden, das eindeutige Dateinamen erstellt, und dann den vollständigen Pfad zu dieser Datei als Eingabe für Ihren Hash-Aufruf verwenden. Dadurch erhalten Sie eindeutige Zeichenfolgen mit konstanter Länge, die Sie Ihren Dateien zuordnen können.

1641582776 752 Erzwingen Sie eindeutige Upload Dateinamen mit django
Aissam Jadli

django erzwingt automatisch einen eindeutigen Dateinamen. Wenn die Datei bereits existiert, werden sieben eindeutige Zeichen an den Dateinamen angehängt

getestet auf django 2.2

.

178760cookie-checkErzwingen Sie eindeutige Upload-Dateinamen mit django?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy