Sie können Dateien in Laravel hochladen, indem Sie die schöne einheitliche API verwenden, um mit vielen verschiedenen Arten von Speichersystemen zu interagieren, von der lokalen Festplatte bis zum Remote-Objektspeicher wie S3.
Wie viele andere Laravel-Komponenten können Sie über die Speicherfassade mit dem Anwendungsdateisystem interagieren: Illuminate/Support/Facades/Storage
Diese Klasse ermöglicht Ihnen den Zugriff auf Speichertreiber, sogenannte Festplatten, die eine gemeinsame Schnittstelle implementieren. So können Sie den zugrunde liegenden physischen Speicher ändern, ohne Ihren Anwendungscode zu ändern.
Dadurch können Sie nicht nur auf die gleiche Weise von Ihrem lokalen Dateisystem, FTP oder AWS S3 lesen und schreiben, sondern auch eine andere Option wählen, je nachdem, ob Sie in der lokalen Umgebung entwickeln oder die Anwendung in der Produktion ausführen .
Wenn Sie erfahren möchten, wie Sie Ihre individuelle Fassade bauen, lesen Sie den folgenden Artikel:
https://inspector.dev/how-to-extend-laravel-with-driver-based-services/
Für weitere technische Artikel können Sie mir auf Linkedin oder X folgen.
Laravel verwaltet den Zugriff auf den Speicher über „Festplatten“, die in der Konfigurationsdatei config/filesystems.php konfiguriert sind. Jede Festplatte hat einen identifizierenden Namen und einen Treiber, mit dem Sie den tatsächlichen Typ des Speichersystems definieren können, das mit der Anwendung verbunden wird.
Je nach Treiber sind dann weitere Optionen konfigurierbar. Bei Datenträgern mit lokalen Treibern muss beispielsweise der Root-Parameter festgelegt werden, um anzugeben, welchem tatsächlichen lokalen Verzeichnis sie entsprechen. Diejenigen mit S3-Treibern müssen die verschiedenen Schlüssel, Geheimnisse, Regionen und Buckets festlegen, um auf AWS S3 oder S3-kompatible Systeme zuzugreifen.
Unter den verschiedenen standardmäßig konfigurierten Festplatten ist die mit dem Namen „public“ eine der interessantesten. Dieser Datenträger dient zum Hosten der Dateien, die von der Laravel-Anwendung öffentlich zugänglich gemacht werden müssen.
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
Wie Sie im Snippet oben sehen können, hat die Festplatte den lokalen Treiber und das Stammverzeichnis ist das Verzeichnis private storage/app/public.
Wie kann ein privates Verzeichnis öffentlich zugänglich sein?
Damit die öffentliche Festplatte funktioniert, müssen Sie einen Symlink erstellen, um den öffentlichen Laravel-Ordner mit dem auf der Festplatte konfigurierten privaten Stammverzeichnis zu verbinden.
Glücklicherweise verfügt Laravel über einen integrierten Befehl, um diese Einrichtung automatisch durchzuführen.
php artisan storage:link
Sie sollten diesen Befehl ausführen, wenn Sie Ihre Laravel-Anwendung zum ersten Mal auf einem Computer installieren, einschließlich Ihrer lokalen Umgebung.
Wenn Sie einen Symlink erstellen, verbindet Laravel den Ordner „storage/app/public“ mit dem Ordner „public/storage“. Das heißt, wenn Sie eine Datei auf einer öffentlichen Seite anzeigen möchten, können Sie Folgendes tun:
{{ asset('storage/file.txt') }}
Die Datei ist physisch in storage/app/public gespeichert, aber dank des Symlinks können Sie über den Pfad yourdomain.com/storage/filename.ext darauf zugreifen
Dies ist erforderlich, da der öffentliche Ordner normalerweise das Stammverzeichnis des Webservers (Apache, NGINX usw.) ist und daher der einzige Pfad ist, auf den Ihre Website oder App verweisen kann. Der Symlink macht einen Teil des Speicherordners nach außen verfügbar.
Hier ist ein Beispiel für ein HTML-Formular, um das Hochladen von Dateien zu ermöglichen:
<form action="/avatar" method="POST" enctype="multipart/form-data"> {{ csrf_field() }} <input type="file" name="avatar"/> <button type="submit"></button> </form>
Das Speichern dieser Datei auf der Festplatte ist sehr einfach. Das Anforderungsobjekt verfügt über die Dateimethode, mit der Sie Elemente abrufen können, die aus einem Formularfeld vom Typ Datei gesendet wurden. Sie können das Element erhalten, indem Sie den Namen des Eingabefelds an die Dateimethode übergeben, um auf die vom Frontend gesendete Datei zuzugreifen.
namespace App/Http/Controllers; use App/Http/Resources/UserResource; class AvatarController extends Controller { public function update(Request $request) { $path = $request->file('avatar')->store("avatars/{$request->user()->id}"); $request->user()->update(['avatar' => $path]); return new UserResource($request->user()); } }
Die Store-Methode ruft die Datei aus der Anfrage ab und speichert sie auf der Festplatte. Dabei wird eine eindeutige ID für den Dateinamen generiert, während die Dateierweiterung aus dem in der Anfrage angegebenen MIME-Typ abgerufen wird. Es gibt den Pfad der gespeicherten Datei zurück, die somit gespeichert oder verwendet werden kann.
store verwendet die in config/filesystem.php konfigurierte Standardfestplatte, Sie können jedoch auch spontan eine andere Festplatte angeben:
$path = $request->file('avatar') ->store("avatars/{$request->user()->id}", 's3');
Das gleiche Ergebnis kann direkt mit der Speicherfassade erzielt werden:
$path = Storage::disk('s3') ->putFile("avatars/{$request->user()->id}", $request->file('avatar'));
Ich persönlich bevorzuge die Verwendung der Speicherfassade, weil sie die Aussage deutlicher macht.
Für weitere technische Artikel können Sie mir auf Linkedin oder X folgen.
Inspector ist ein Tool zur Codeausführungsüberwachung, das speziell für Softwareentwickler entwickelt wurde. Sie müssen nichts auf Serverebene installieren, installieren Sie einfach das Laravel-Paket und schon kann es losgehen.
Wenn Sie nach HTTP-Überwachung, Einblicken in Datenbankabfragen und der Möglichkeit suchen, Warnungen und Benachrichtigungen an Ihre bevorzugte Messaging-Umgebung weiterzuleiten, testen Sie Inspector kostenlos. Registrieren Sie Ihr Konto.
Oder erfahren Sie mehr auf der Website: https://inspector.dev
Das obige ist der detaillierte Inhalt vonDatei in Laravel hochladen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!