Laravel storage:link macht Probleme

Auf unserem Plesk-Hosting haben wir die Einstellungen so vorgenommen, dass der Dokumenten-Stamm (Document-Root) für den Webserver direkt auf den /public-Pfad von Laravel (/laravel/public) verweist.

Daher klappt aber der php artisan storage:link Befehl nicht, so dass wir diesen manuell ausführen mussten um /laravel/storage/app/public auf /laravel/public/storage zu mappen mit einem relativen softlink:

ln -s -r /var/www/vhosts/ndwradio.de/laravel/storage/app/public  /var/www/vhosts/ndwradio.de/laravel/public/storage

Danach müssen wir Plesk noch mitteilen, dass wir Symbolischen Links auch noch folgen wollen 🙂 Das machen wir am besten nach Anleitung, die wir bei Plesk hier finden: https://support.plesk.com/hc/en-us/articles/12377715472535-Plesk-domain-shows-403-Forbidden-Symbolic-link-not-allowed-or-link-target-not-accessible

Ich habe mich dazu entschieden, dass serverweit auf meinem Dedicated Server von CMO zu machen und zwar mit dem folgenden Befehl in der Shell des Servers:

for DOMAIN_NAME in $(plesk bin domain --list); do plesk bin subscription --update-web-server-settings $DOMAIN_NAME -apache-restrict-follow-sym-links false ; done

Danach funktioniert alles, wie erwartet und man hat Zugriff auf die verlinken Verzeichnisse und die darin enthaltenen Dateien.

Automatisches speichern der Cover-Bilder

mAirlist bietet die Möglichkeit, mit dem Parameter %ALBUMART das im Track hinterlegte Cover mit zu übermitteln.

Wichtig ist es dabei zu beachten, dass hier für das POST-Kommando multipart/form-data gewählt wird. Als Parameter wähle ich hier $cover und $mairlistid um später in der Laravel-Programmierung das Cover unter der mairlistid speichern zu können, da alle unsere Titel in der Datenbank auf dem Webserver mti der mairlistid indentifiziert werden können.

Wichtig bei Laravel ist, da es sich um ein POST-COmmand handelt muss die csfr-token-prüfung abgeschaltet werden, sonst kommt der Quatsch erst gar nicht beim Controller an. Das hat mich ein paar Stunden gekostet, bis ich das gemerkt habe, warum mein lokaler Test funktioniert, aber der externe Test nicht.

In Laravel 11.x muss das in config/app.php mit hinzugefügt werden:

   ->withMiddleware(function (Middleware $middleware) {
        $middleware->validateCsrfTokens(except: [
            'logging/*',
        ]);
    })

damit wird der Pfad logging/* exkludiert von der csfr-Token-Prüfung und die Daten kommen beim Controller dann auch an.

In meinem Controller für das Logging habe ich das dann so umgesetzt, dass mairlistid und cover entsprechdend ermittelt und gesichert werden:

public function cover(Request $request)
    {

         // Prüfe ob die variablen gewünscht und im richtigen Format sind
        $request->validate([
            'cover' => 'required|image|mimes:jpeg,png,jpg,gif,svg|max:2048',
            'mairlistid' => 'required|string',
        ]);

        // Erhalte die mairlistid aus der Anfrage
        $mairlistid = $request->input('mairlistid');

        // Erhalte das Bild aus der Anfrage
        $image = $request->file('cover');

        // Definiere den Speicherort und den Dateinamen
        $destinationPath = 'coverimages';
        $imageName = $mairlistid . '.' . $image->getClientOriginalExtension();

        // Speichere das Bild
        $image->storeAs($destinationPath, $imageName, 'public');

        // Erfolgsnachricht mit Bildname zurückgeben
        return back()->with('success', 'Image uploaded successfully')->with('image', $imageName);

}

Somit werden dann die erhaltenen cover-Images als mairlistid.ext auf dem storage in Laravel gespeichert. Tolle Wurst.