3 Tipps für das Arbeiten mit Dateien in Laravel 5

Laravel 5 erleichtert uns die Arbeit mit Dateien enorm – sei es die Verwaltung von hochgeladenen Dateien oder auch das Bearbeiten von Bildern. In diesem Artikel gebe ich euch 3 Tipps mit denen ihr diese mächtigen Tools benutzen könnt.

Dateiuploads

Das einfache Handling von Dateiuploads übernimmt in Laravel 5 die Klasse UploadedFile. Diese erweitert diverse Funktionalitäten der PHP internen Klasse SplFileInfo. Für typische Dateiuploads über ein Formular bekommen wir hier fertige Funktionalitäten, die uns das weitere Verarbeiten erleichtern.

War der Upload erfolgreich? Ist die Datei überhaupt für unsere Zwecke geeignet? Wie groß ist die Datei? Neben Informationen über die Datei gibt es außerdem die einfache Möglichkeit, die Datei an ihren Zielort zu verschieben.

Sehen wir uns ein kleines Beispiel an, wie so ein Dateiupload serverseitig aussehen kann. Unser Request wird ganz normal von einem Formular an eine Controllermethode geleitet und enthält ein <input type=“file“> Element namens upload.

Wie das Beispiel zeigt gibt die UploadedFile Klasse uns alle Möglichkeiten an die Hand, mit den Dateien zu interagieren. Um die Datei aus dem Request auszulesen haben wir die hasFile() und file() Methoden und ab diesem Zeitpunkt können wir alle notwendigen Informationen auslesen und die Datei an ihren Zielort verschieben – und das Ganze mit einem einfachen, objektorientierten Interface.

 

 

Verschiedene Speicherorte für Dateien

Ein weiterer riesiger Vorteil in Laravel 5 ist die Integration des Flysystem PHP Pakets. Das Flysystem ist eine einheitliche API für mehrere Dateisysteme – einfacher ausgedrückt können wir das Handling unserer Dateien programmieren und dann einfach über die Konfiguration unserer Applikation bestimmen wo diese nun wirklich gespeichert werden.

Beispiele für die Speicherorte wären einerseits natürlich das lokale Dateisystem, andererseits aber auch Cloudspeicherdienste wie beispielsweise Amazon S3 oder Rackspace. Mit einer einfachen Switch in der Konfiguration können wir also von einem Moment auf den anderen sagen, dass alle Dateien ab sofort in ein zentrales S3 gespeichert und von dort abgerufen werden sollen ohne dass wir Code innerhalb unserer Models oder Controller verändern müssen.

Das Interface ist in sogenannte Disks aufgeteilt. Jede dieser Disks stellt einen Speicherort dar, den wir in der Datei config/filesystems.php konfigurieren können. Greifen wir auf unseren Speicher über eine Disk zu wird automatisch der dahinter liegende Speicherort aufgerufen. Sollten wir die Disk nicht angeben wird die Anfrage einfach an die default Disk gestellt.

Stellen wir uns also einfach vor wir haben eine Disk cloud die auf einen Rackspace Speicherplatz zugreift. Diese Zugriffe sind an verschiedenen Stellen in unserem Code vorhanden. Möchten wir nun unsere Daten von Rackspace auf Amazon S3 umstellen genügt es, den passenden Flysystem Treiber mit Composer zu installieren und die nötigen Zugangsdaten in der Konfigurationsdatei anzugeben. Mehr muss nicht angepasst werden.

 

 

Aber fangen wir früher an. Zum Beispiel mit einem Dateiupload, der unsere Daten in einem Amazon S3 Speicher ablegt.

Amazon AWS Treiber installieren

Als ersten Schritt tragen wir in unsere package.json das benötigte Treiberpaket league/flysystemawss3v3 ~1.0 ein und aktualisieren unsere Applikation mit dem Befehl composer update.

 

Disk konfigurieren

Nun können wir die Datei config/filesystems.php öffnen und die passende Disk konfigurieren. Als cloud Disk wurde hier s3 definiert, das bedeutet wir tragen unsere Amazon S3 Zugangsdaten im Array s3 unter disks ein. Diese Zugangsdaten findet ihr bei im Amazon AWS wo ihr auch den S3 Speicher konfiguriert habt.

 

Die Storage Facade benutzen

Für den einfachen Zugriff auf die Disks und die dahinter liegenden Datenspeicher gibt es die Facade Storage in Laravel 5. Über diese Facade können wir entweder direkt auf die Methoden zum Schreiben, Lesen und Verändern von Dateien zugreifen oder zuerst die passende Disk auswählen und dann über diese Disk zugreifen. Sollten wir die Disk nicht auswählen wird automatisch die konfigurierte default Disk verwendet (im Normalfall also das lokale Dateisystem).

Erweitern wir obiges Beispiel also darum, die Datei über das Flysystem zu speichern.

Wie wir sehen hat sich nur eine Zeile geändert: das finale Verschieben der Datei an den Zielort. Zuerst wählen wir die passende Disk – nämlich cloud – aus. Danach schreiben wir mit der put() Methode etwas auf diese Disk. Der erste Parameter ist dabei der Zielort, der zweite Parameter ist der Inhalt der in diese Datei geschrieben werden soll.

Für den zweiten Parameter lesen wir unsere neu hochgeladene Datei aus. Um auf den aktuellen Speicherort (nämlich den temporären Ordner unseres Webservers) zugreifen zu können bietet die UploadedFile Klasse uns die Methode getRealPath() an.

Fertig. Sollten wir nun den Cloudspace Anbieter wechseln wollen verknüpfen wir die cloud Disk einfach mit einem anderen Anbieter und schon geht alles weiter – eine Sache von wenigen Minuten ohne umständliches Suchen und Umprogrammieren.

 

 

Bilder verkleinern

Bilder sind heutzutage überall im Web. Wenige Dinge musste ich öfter umsetzen als einen Bilderupload. Da es Bilder in allen Größen, Formen, Auflösungen und Dateiformaten gibt ist es gerade hier enorm wichtig, die hochgeladenen Bilder in einem sinnvollen Format und einer für unsere Applikation sinnvollen Größe abzuspeichern.

Dies spart einerseits Speicherplatz, Traffic beim Ausliefern der Bilder und verringert natürlich auch die Ladezeit unserer Webseite. Schließlich bringt es nichts wenn ein 16 Megapixel Bild hochgeladen wird und später dann auf der Seite in 300 Pixel breit und 200 Pixel hoch dargestellt wird.

Dank der einfachen Erweiterung von Laravel gibt es natürlich auch hier eine wundervoll einfache Möglichkeit, diese Probleme zu lösen. Ein beliebtes Package dafür ist die Intervention Image Klasse. Sehen wir uns ein Beispiel an, das diese Klasse verwendet.

 

Intervention Image Klasse installieren

Um unserem Projekt die benötigten Dateien hinzuzufügen installieren wir als erstes über Composer das Paket intervention/image.  Danach fügen wir in der Datei config/app.php im Array providers folgende Zeile hinzu:

‚Intervention\Image\ImageServiceProvider‘

Für Laravel 5.1 sieht die Zeile so aus:

Intervention\Image\ImageServiceProvider::class

Als letztes fügen wir direkt darunter in das Array aliases noch folgende Zeile ein:

‚Image‘ => ‚Intervention\Image\Facades\Image‘

Die passende Version für Laravel 5.1:

‚Image‘ => Intervention\Image\Facades\Image::class

 

Hochgeladenes Bild verkleinern und in passendes Format umwandeln

Nun können wir die Image Facade verwenden um auf die Funktionalitäten zuzugreifen. Sehen wir uns also eine Beispielmethode eines Controllers an, in der wir diese Funktionalitäten einsetzen um ein Bild auf die gewünschte Größe zu verkleinern und in ein JPG Bild umzuwandeln.

 

Dieses Beispiel kombiniert alle Tipps dieses Artikels. Zuerst überprüfen wir die hochgeladene Datei und stellen sicher, dass der Upload problemlos durchgeführt wurde.

Danach erzeugen wir mit Hilfe von Image::make() eine neue Bildinstanz die wir ab sofort verändern können. Zuerst verkleinern wir das Bild auf die Maße 300×200 Pixel mit Hilfe der resize() Methode.

Als Zweites benutzen wir die encode() Methode und generieren ein JPG Bild daraus – egal ob das Bild beim Upload ein GIF, PNG oder sonstiges Dateiformat war. Die encode() Methode gibt die Bilddaten zurück, daher können wir die Daten direkt an die Storage::put() Methode übergeben um dieses in den Cloudspeicher zu schreiben.

 

 

Ich hoffe, diese Tipps erleichtern euch die Arbeit mit Dateien in Laravel. Was benutzt ihr am häufigsten bei der Arbeit mit Dateien? Hinterlasst mir gerne einen Kommentar unter dem Artikel.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.

*