Der Umgang mit privaten Bildern in laravel 5?
Ich bin neu auf Laravel und versuchen, zu speichern private Bilder so, dass nur authentifizierte Benutzer können auf Sie zugreifen. Zunächst möchte ich die gespeicherten Bilder in der Öffentlichkeit/UserImages-Ordner. Aber hier sind alle die Bilder sind zugänglich, nicht authentifizierten Benutzern als auch von going to Inspect Element " des chrome und dann das ändern der Benutzer-IDs. Bitte helfen Sie mich aus...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist wirklich bis zu Ihnen. Es müssen außerhalb der
public
Verzeichnis - würd ich persönlich abholenresources/uploads
oderstorage/uploads
, oder speichern Sie Sie ab-server vollständig mit cloud-Dateisystem-Unterstützung.Was auch immer Sie wählen, müssen Sie eine route, liest die Datei und übergibt es zusammen, um den Nutzer nach der ersten Prüfung, die Sie Zugriff haben.
Folgende ist, wie ich das problem gelöst, das speichern der Bilder in Laravel 5, so dass nur authentifizierte Benutzer können die Anzeige der Bilder. Menschen, die nicht authentifiziert sind, gelenkt werden, um eine login-Seite. Mein server ist ein Ubuntu/Apache2-server.
Erstellen Sie das Verzeichnis /var/www/YOURWEBSITE/app/Assets/Images
Add route, um app/Http/routes.php.
Route::get('/images/{file}','ImageController@getImage');
Controller erstellt app/Http/Controllers/ImageController.php
In Ihrer Ansicht haben Sie die img-tags die:
Dies ist natürlich vorausgesetzt test.jpg ist eine Datei in /var/www/YOURWEBSITE/app/Assets/Images/
Natürlich können Sie hinzufügen, mehr Logik wie nicht hartcodieren den Pfad der Bilder, etc. Dies ist nur ein einfaches Beispiel zur Authentifizierung erzwingen. Beachten Sie die Verwendung von middleware('auth') in dem controller-Konstruktor.
Ich habe das gleiche Problem vor einigen Tagen und kam mit dieser Lösung:
Erste, was Sie tun müssen, ist laden Sie die Datei auf einem nicht-öffentlichen Verzeichnis. Meine app ist das speichern von gescannten Rechnungen, also werde ich legen Sie Sie im inneren
storage/app/invoices
. Der code für die Datei hochladen und generieren der url:Den url zurückgegeben wird, sollte das Ergebnis in etwas wie http://yourdomain.com/storage/invoices/uniquefilename.jpg
Erstellen Sie nun einen controller, der die
auth middleware
zu gewährleisten, wird der Benutzer authentifiziert. Dann definieren Sie eine Methode, packt die Datei aus dem Verzeichnis private und gibt es als Datei response. Das wäre:Die Letzte Sache ist, registrieren Sie die route in Ihrem
routes/web.php
Datei:So dort haben Sie es, eine hübsche wiederverwendbare snippet für alle Ihre Projekte, die sich mit privaten Dateien 🙂
Hier, wie es in Laravel 5.7
Haben private Dateien (Bilder), die Sie brauchen, um zu dienen die Dateien über ein route => controller fließen. Und dein auth-middleware behandelt die Authentifizierung und Berechtigung. Wenn weitere Genehmigung erforderlich sind, behandeln Sie es in den controller.
Also zuerst haben wir eine route:
Hier können wir eine route, die behandeln alle unsere Dateien [ich persönlich nicht bevorzugen,].
Wir können tun, dass mit einer solchen Strecke (es ist wie ein Platzhalter).
Können Sie nennen es auch so:
Sonst wir erstellen eine route für jede Art/Kategorie von Dateien: (Vorteil: Sie werden in der Lage sein, um bessere Kontrolle über die Zugänglichkeit. (Jede route und die Art der Ressourcen und Regeln. Wenn Sie möchten, um zu erreichen, dass mit der wild-card-route (ich nenne es, dass) Sie brauchen bedingte Blöcke (if -, else -, den Umgang mit allen verschiedenen Situationen. Es ist unnötige Operationen [gehen, direkt auf den rechten block, wenn die Strecken getrennt sind, ist es besser, plus aus, die es Ihnen erlauben, sich zu organisieren, besser die Berechtigungen handling]).
Wir hatten unsere Routen NUN Controller/Controller
Die wild-card mit einem
Die pro Strecke eine
(große Differenz, ist der parameter, jetzt ist es die Referenz, nur der Dateiname und nicht der relative Pfad zur storage-Festplatte root)
Jetzt können Sie durch die Bildung der korrekten url (gehen Sie zu Speicher kopieren Vergangenheit den Namen der Datei, und bilden Sie sich Ihre route. es sollte Ihnen zeigen, das Bild)
Eine Letzte Sache, die linke:
, Wie um zu zeigen, dass es in Anbetracht
die wild-card mit einem
Beachten Sie, dass
routeName
hier in dem Beispiel oben wirdstorage.file
, undfileParam
wärefilePath
. $storageRelativePath zum Beispiel erhalten Sie von der db (in der Regel das ist, was es sein wird).Die pro route
Gleiche, aber wir bieten nur den Dateinamen.
Hinweise:
Der beste Weg, so zu schicken, eine Antwort, mit response()->Datei();.
Das, was Sie finden, in das 5,7-doc.
Dass Leistung Weise gegen Bild::make($storagePath)->response();. Es sei denn, Sie brauchen, um es zu ändern, im Fliegen.
Können Sie überprüfen, meine Artikel im medium: https://medium.com/@allalmohamedlamine/how-to-serve-images-and-files-privatly-in-laravel-5-7-a4b469f0f706