Ich habe Benutzeravatare im Laravel-Speicher hochgeladen. Wie kann ich darauf zugreifen und sie in einer Ansicht rendern?
Der Server verweist auf alle Anforderungen. /public
Wie kann ich sie anzeigen, wenn sie sich im /storage
Ordner befinden?
Ich habe Benutzeravatare im Laravel-Speicher hochgeladen. Wie kann ich darauf zugreifen und sie in einer Ansicht rendern?
Der Server verweist auf alle Anforderungen. /public
Wie kann ich sie anzeigen, wenn sie sich im /storage
Ordner befinden?
Antworten:
Der beste Ansatz besteht darin, einen symbolischen Link wie @SlateEntropy zu erstellen , auf den in der folgenden Antwort sehr gut hingewiesen wird . Um dies zu unterstützen, enthält Laravel seit Version 5.3 einen Befehl, der dies unglaublich einfach macht:
php artisan storage:link
Das schafft einen Symlink von public/storage
bis zu storage/app/public
für Sie und das ist alles, was dazu gehört. Jetzt kann auf jede Datei in /storage/app/public
über einen Link zugegriffen werden wie:
http://somedomain.com/storage/image.jpg
Wenn Sie aus irgendeinem Grund keine symbolischen Links erstellen können (möglicherweise verwenden Sie Shared Hosting usw.) oder einige Dateien hinter einer Zugriffssteuerungslogik schützen möchten, gibt es die Alternative, eine spezielle Route zu haben, die und liest dient dem Bild. Zum Beispiel eine einfache Schließungsroute wie diese:
Route::get('storage/{filename}', function ($filename)
{
$path = storage_path('public/' . $filename);
if (!File::exists($path)) {
abort(404);
}
$file = File::get($path);
$type = File::mimeType($path);
$response = Response::make($file, 200);
$response->header("Content-Type", $type);
return $response;
});
Sie können jetzt wie bei einem Symlink auf Ihre Dateien zugreifen:
http://somedomain.com/storage/image.jpg
Wenn Sie die Interventionsbildbibliothek verwenden , können Sie die integrierte response
Methode verwenden, um die Dinge prägnanter zu gestalten:
Route::get('storage/{filename}', function ($filename)
{
return Image::make(storage_path('public/' . $filename))->response();
});
WARNUNG
Beachten Sie, dass durch das manuelle Bereitstellen der Dateien eine Leistungseinbuße entsteht , da Sie den gesamten Lebenszyklus von Laravel-Anforderungen durchlaufen, um den Dateiinhalt zu lesen und zu senden. Dies ist erheblich langsamer als der HTTP-Server.
public
Verzeichnis speichern . Auf diese Weise vermeiden Sie den Aufwand, eine Image-Antwort erstellen zu müssen, die vom HTTP-Server viel schneller verarbeitet werden kann.
Eine Möglichkeit besteht darin, eine symbolische Verknüpfung zwischen einem Unterordner in Ihrem Speicherverzeichnis und einem öffentlichen Verzeichnis herzustellen.
Beispielsweise
ln -s /path/to/laravel/storage/avatars /path/to/laravel/public/avatars
Dies ist auch die Methode von Envoyer , einem Deployment Manager, der von Taylor Otwell, dem Entwickler von Laravel, entwickelt wurde.
storage
öffentlich gespeichert sind. In der Regel benötigen Avatare keine Zugriffskontrolle. Wenn keine Sicherheit erforderlich ist, ist die Verwendung von Middleware oder Route nur eine Verschwendung für Ihre Ressourcen. Es ist auch erwähnenswert, dass in Laravel 5.2 eine separate Datei "Disk" für öffentliche Dateien ( laravel.com/docs/5.2/filesystem ) unter Verwendung von Symlinks vorhanden ist.
Gemäß Laravel 5.2-Dokumenten sollten Ihre öffentlich zugänglichen Dateien in einem Verzeichnis abgelegt werden
storage/app/public
Um sie über das Web zugänglich zu machen, sollten Sie einen symbolischen Link von public/storage
bis erstellen storage/app/public
.
ln -s /path/to/laravel/storage/app/public /path/to/laravel/public/storage
Jetzt können Sie in Ihrer Ansicht mithilfe des Asset-Hilfsprogramms eine URL zu den Dateien erstellen:
echo asset('storage/file.txt');
Wenn Sie unter Windows arbeiten, können Sie diesen Befehl unter cmd ausführen:
mklink /j /path/to/laravel/public/avatars /path/to/laravel/storage/avatars
von: http://www.sevenforums.com/tutorials/278262-mklink-create-use-links-windows.html
Zunächst müssen Sie mit dem Befehl artisan einen symbolischen Link für das Speicherverzeichnis erstellen
php artisan storage:link
In jeder Ansicht können Sie dann über einen URL-Helfer wie diesen auf Ihr Bild zugreifen.
url('storage/avatars/image.png');
Es ist gut, alle privaten Bilder und Dokumente im Speicherverzeichnis zu speichern, dann haben Sie die volle Kontrolle über den Dateiether, den Sie bestimmten Benutzertypen erlauben können, auf die Datei zuzugreifen oder diese einzuschränken.
Erstellen Sie eine Route / ein Dokument und zeigen Sie auf eine beliebige Controller-Methode:
public function docs() {
//custom logic
//check if user is logged in or user have permission to download this file etc
return response()->download(
storage_path('app/users/documents/4YPa0bl0L01ey2jO2CTVzlfuBcrNyHE2TV8xakPk.png'),
'filename.png',
['Content-Type' => 'image/png']
);
}
Wenn Sie klicken, wird die localhost:8000/docs
Datei heruntergeladen, falls vorhanden.
Die Datei muss sich root/storage/app/users/documents
gemäß dem obigen Code im Verzeichnis befinden, dies wurde am getestet Laravel 5.4
.
Wenn Sie eine kleine Anzahl privater Bilder laden möchten, können Sie die Bilder in base64 codieren und <img src="{{$image_data}}">
direkt wiedergeben:
$path = image.png
$full_path = Storage::path($path);
$base64 = base64_encode(Storage::get($path));
$image_data = 'data:'.mime_content_type($full_path) . ';base64,' . $base64;
Ich habe privat erwähnt, weil Sie diese Methoden nur verwenden sollten, wenn Sie keine Bilder speichern möchten, auf die über eine URL öffentlich zugegriffen werden kann. Stattdessen müssen Sie immer die Standardmethode verwenden (Linkspeicher / öffentlicher Ordner und Bilder mit HTTP-Server bereitstellen).
Achten Sie beim Codieren auf base64()
zwei wichtige Nachteile:
Wenn Sie PHP verwenden, verwenden Sie einfach die PHP-Symlink-Funktion wie folgt:
symlink('/home/username/projectname/storage/app/public', '/home/username/public_html/storage')
Ändern Sie den Benutzernamen und den Projektnamen in die richtigen Namen.
ohne Site-Namen
{{Storage::url($photoLink)}}
Wenn Sie dem Beispiel einen Site-Namen hinzufügen möchten, um ihn an API-JSON-Felids anzuhängen
public function getPhotoFullLinkAttribute()
{
return env('APP_URL', false).Storage::url($this->attributes['avatar']) ;
}
Wenn Sie wie ich sind und irgendwie vollständige Dateipfade haben (ich habe einige glob () - Musterabgleiche für die erforderlichen Fotos durchgeführt, sodass ich so ziemlich vollständige Dateipfade erhalte), und Ihr Speicher-Setup ist gut verknüpft (dh Ihre Pfade habe den String storage/app/public/
), dann kannst du meinen kleinen dreckigen Hack unten benutzen: p)
public static function hackoutFileFromStorageFolder($fullfilePath) {
if (strpos($fullfilePath, 'storage/app/public/')) {
$fileParts = explode('storage/app/public/', $fullfilePath);
if( count($fileParts) > 1){
return $fileParts[1];
}
}
return '';
}
Wenn die Festplatte 'local' für Sie nicht funktioniert, versuchen Sie Folgendes:
'default' => env('FILESYSTEM_DRIVER', 'public'),
vonproject_folder/config/filesystem.php
php artisan config:clear
php artisan storage:link
Um die URL des hochgeladenen Bildes zu erhalten, können Sie diese verwenden Storage::url('iamge_name.jpg');