1. get_valid_filename – Was ist das?
django.utils.text.get_valid_filename ist eine kleine Hilfsfunktion, die Strings in sichere Dateinamen für Dateisysteme umwandelt.
Sie entfernt oder ändert problematische Zeichen (wie Slashes, Steuerzeichen usw.) auf den meisten Betriebssystemen wie Windows, macOS und Linux und normalisiert Strings in ein vorhersehbares Format.
Warum ist das notwendig?
Wenn Benutzer Dateien hochladen oder mit beliebigen Eingaben (z. B. Blogtitel, Benutzertags) Dateinamen erstellen, kann das Einfügen von Zeichen wie Slashes (../etc/passwd) zu einem Directory Traversal oder zu abnormalen Zeichen führen, was das Dateisystem gefährden oder Sicherheitsanfälligkeiten verursachen kann.
2. Funktionsweise
from django.utils.text import get_valid_filename
raw = "My: New/Project? 2024*"
safe = get_valid_filename(raw)
print(safe) # → "My_New_Project_2024"
Wichtige Funktionen
| Eingabe | Ergebnis | Beschreibung |
|---|---|---|
"my file.txt" |
"my_file.txt" |
Leerzeichen → Unterstrich |
"../etc/passwd" |
"etc_passwd" |
Vorangehende Punkte und Slashes entfernt |
"file<name>.txt" |
"file_name_.txt" |
<·> ersetzt |
" " |
"" |
Leerzeichen allein ergibt an leeren String |
"a"*300 |
"a"*255 |
Trimmt bis zur Grenze des Dateisystems (255 Zeichen) |
Die Funktion ist plattformübergreifend und erlaubt nur sichere Zeichensätze ([A-Za-z0-9_.-]), alle anderen werden durch Unterstriche (_) ersetzt.
3. Nützliche Szenarien
| Szenario | Notwendigkeit |
|---|---|
| Benutzer-Upload | Verhindert Directory Traversal (../../etc/passwd) und unerlaubte Zeichen |
| Slug-basierte Dateinamen | Konvertiert Blogtitel in Dateinamen für statische Seiten |
| Datenexport | Erzeugt Dateinamen für CSV/JSON, die Datenbankfelder (Kommas, Anführungszeichen usw.) enthalten |
| Automatische Backups | Erzeugt Dateinamen mit Zeitstempeln aus beliebigen Strings für Backup-Dateien |
4. Praktisches Beispiel: Bild-Upload speichern
# views.py
from django.shortcuts import render
from django.core.files.storage import default_storage
from django.utils.text import get_valid_filename
def upload_image(request):
if request.method == 'POST':
uploaded = request.FILES['image']
# Original Dateinamen bereinigen
safe_name = get_valid_filename(uploaded.name)
# Optional Benutzer-ID oder Zeitstempel hinzufügen
final_name = f"{request.user.id}_{safe_name}"
path = default_storage.save(f"uploads/{final_name}", uploaded)
return render(request, 'success.html', {'path': path})
return render(request, 'upload.html')
Ergebnis
Egal, wie der Benutzer den Dateinamen angibt, der gespeicherte Name ist sicher, es gibt kein Directory Traversal und die Wahrscheinlichkeit von Duplikaten ist gering.
5. Schneller Überblick
from django.utils.text import get_valid_filename
# 1. Grundreinigung
safe = get_valid_filename("My: New/Project? 2024*") # → "My_New_Project_2024"
# 2. In Dateipfaden verwenden
path = f"media/{safe}.jpg"
# 3. Sicherstellen von Eindeutigkeit durch Kombination mit UUID
import uuid
unique_name = f"{uuid.uuid4().hex}_{safe}.jpg"
6. Kernzusammenfassung
get_valid_filenameschützt das Dateisystem vor gefährlichen Namen mit einer einzeiligen Code.- Verwenden Sie es immer, wenn Sie Benutzereingaben oder beliebige Strings in Dateinamen umwandeln.
- Der Code ist sauber, plattformübergreifend und sicher.
Tipp: Wenn Sie Leerzeichen beibehalten oder Unicode bewahren möchten, können Sie
slugifykombinieren oder einen benutzerdefinierten Helfer erstellen, aber in den meisten Fällen istget_valid_filenamedie beste Wahl.
Es sind keine Kommentare vorhanden.