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_filename schü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 slugify kombinieren oder einen benutzerdefinierten Helfer erstellen, aber in den meisten Fällen ist get_valid_filename die beste Wahl.