Cookie Settings

This site uses cookies that need consent. Learn more

Skip to content
Laravel

Spatie Media Library: Delete original after conversions have been generated

Delete Button.

Mit der Spatie Media Library für Laravel ist es ein leichtes, Dateien mit Eloquent-Models zu verknüpfen.

Sie unterstützt das Anlegen von Conversions. Was aber, wenn das Originalbild nach der Erstellung der Conversions gelöscht werden soll (z.B. um Platz zu sparen).

Nach dem Upload von Dateien und der Erstellung von Conversion werden die Originale beibehalten. Dadurch können immer wieder neue, andere, Conversions generiert werden.

Wenn das Originalbild wirklich nicht mehr benötigt wird, kann über das Event ConversionHasBeenCompleted reagiert werden und das Original gelöscht werden.

Erstellen Sie den Listener RemoveOriginalImageListener:

php artisan make:listener RemoveOriginalImageListener

Ergänzen Sie den Listener in EventServiceProvider

Die Implementierung von RemoveOriginalImageListener.
Im Listener wird geprüft ob das Media-Item über eine Conversion verfügt und diese dann gelöscht.

Nachteile

Das Löschen des Originals führt dazu, dass die Medienbibliothek "denkt", dass das Bild nicht mehr existiert (was auch stimmt). Daher werden Hilfsfunktionen wie singleFile() nicht mehr funktionieren. Ein möglicher Workaround ist es, das Bild durch eine leere Datei oder einen Symlink zu einer der Konvertierungen zu ersetzen. Diese Variante könnte sich anbieten wenn man nur Speicherplatz sparen will. Dies ist jedoch eine sehr hakelige Lösung die nicht zu empfehlen ist.

Das Original zu löschen ist auch deswegen riskant weil später keine neue Konvertierungen gerendert werden können. Für jede Löschoperation gilt: Vergewissern Sie sich, dass Sie über ein Backup verfügen oder absolut sicher sind, dass Sie das Originalbild nicht mehr benötigen.

Bevor Sie zu dieser Lösung greifen, sollten Sie sich generell fragen:

  • Kann der gesamte Prozess neu durchdacht und besser gestaltet werden, so dass dieser umständliche Ansatz nicht erforderlich ist?

  • Ist die Media-Library vielleicht nicht die richtige Lösung für diesen Anwendungsfall? Vielleicht wäre es in dieser speziellen Situation besser, nicht die Media-Library zu verwenden und diesen Teil selbst zu implementieren.