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?
Erzwingen Sie eindeutige Upload-Dateinamen mit django?
zjm1126
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. Wennupload_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
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.
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)
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.
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
.
Sie benötigen eine Python-Bibliothek zum Umbenennen von Dateien, damit sie eindeutig sind?
– Aurri
20. Apr. 10 um 8:42
Siehe Antwort von @mlissner. Dateien mit der Standardeinstellung
Storage
-Klasse generiert jetzt automatisch eindeutige Namen, es wird kein Benutzercode mehr benötigt. Sehenget_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