Dateiablage
- Einführung
- Konfiguration
- Der lokale Treiber
- Die öffentliche Festplatte
- Treibervoraussetzungen
- Caching
- Erhalten von Platteninstanzen
- Abrufen von Dateien
- Herunterladen von Dateien
- Datei-URLs
- Datei-Metadaten
- Speichern von Dateien
- Hochladen von Dateien
- Sichtbarkeit von Dateien
- Löschen von Dateien
- Verzeichnisse
- Bestimmte Dateisysteme
Einführung
Laravel bietet dank des wunderbaren Flysystem-PHP-Pakets von Frank de Jonge eine leistungsstarke Abstraktion des Dateisystems. Die Laravel-Flysystem-Integration bietet einfache Treiber für die Arbeit mit lokalen Dateisystemen, SFTP und Amazon S3. Noch besser ist, dass es erstaunlich einfach ist, zwischen diesen Speicheroptionen zwischen Ihrer lokalen Entwicklungsmaschine und dem Produktionsserver zu wechseln, da die API für jedes System gleich bleibt.
Konfiguration
Die Konfigurationsdatei des Dateisystems von Laravel befindet sich unter config/filesystems.php
. In dieser Datei können Sie alle „Laufwerke“ Ihres Dateisystems konfigurieren. Jedes Laufwerk steht für einen bestimmten Speichertreiber und Speicherort. Beispielkonfigurationen für jeden unterstützten Treiber sind in der Konfigurationsdatei enthalten, so dass Sie die Konfiguration ändern können, um Ihre Speicherpräferenzen und Anmeldeinformationen widerzuspiegeln.
Der local
-Treiber interagiert mit Dateien, die lokal auf dem Server gespeichert sind, auf dem die Laravel-Anwendung läuft, während der s3
-Treiber verwendet wird, um in den Cloud-Speicherdienst S3 von Amazon zu schreiben.
{tip} Sie können beliebig viele Laufwerke konfigurieren und sogar mehrere Laufwerke haben, die denselben Treiber verwenden.
Der lokale Treiber
Bei Verwendung des local
-Treibers sind alle Dateioperationen relativ zum root
-Verzeichnis, das in Ihrer filesystems
-Konfigurationsdatei definiert ist. Standardmäßig ist dieser Wert auf das Verzeichnis storage/app
eingestellt. Daher würde die folgende Methode in das Verzeichnis storage/app/example.txt
schreiben:
use Illuminate\Support\Facades\Storage;Storage::disk('local')->put('example.txt', 'Contents');
Der öffentliche Datenträger
Der public
-Datenträger, der in der filesystems
-Konfigurationsdatei Ihrer Anwendung enthalten ist, ist für Dateien vorgesehen, die öffentlich zugänglich sein werden. Standardmäßig verwendet die public
-Diskette den local
-Treiber und speichert ihre Dateien in storage/app/public
.
Um diese Dateien über das Web zugänglich zu machen, sollten Sie einen symbolischen Link von public/storage
nach storage/app/public
erstellen. Wenn Sie diese Ordnerkonvention verwenden, bleiben Ihre öffentlich zugänglichen Dateien in einem Verzeichnis, das bei der Verwendung von Zero-Down-Time-Deployment-Systemen wie Envoyer problemlos gemeinsam genutzt werden kann.
Um den symbolischen Link zu erstellen, können Sie den storage:link
Artisan-Befehl verwenden:
php artisan storage:link
Sobald eine Datei gespeichert und der symbolische Link erstellt wurde, können Sie mit der asset
-Hilfe eine URL zu den Dateien erstellen:
echo asset('storage/file.txt');
Sie können weitere symbolische Links in Ihrer filesystems
-Konfigurationsdatei konfigurieren. Jeder der konfigurierten Links wird erstellt, wenn Sie den Befehl storage:link
ausführen:
'links' => ,
Treibervoraussetzungen
Composer-Pakete
Bevor Sie die S3- oder SFTP-Treiber verwenden, müssen Sie das entsprechende Paket über den Composer-Paketmanager installieren:
- Amazon S3:
league/flysystem-aws-s3-v3 ~1.0
- SFTP:
league/flysystem-sftp ~1.0
Zusätzlich können Sie einen CachedAdapter installieren, um die Leistung zu erhöhen:
- CachedAdapter:
league/flysystem-cached-adapter ~1.0
S3-Treiberkonfiguration
Die Informationen zur S3-Treiberkonfiguration befinden sich in Ihrer config/filesystems.php
Konfigurationsdatei. Diese Datei enthält ein Beispielkonfigurationsarray für einen S3-Treiber. Es steht Ihnen frei, dieses Array mit Ihrer eigenen S3-Konfiguration und Ihren Anmeldedaten zu ändern. Der Einfachheit halber entsprechen diese Umgebungsvariablen der von der AWS CLI verwendeten Namenskonvention.
FTP-Treiberkonfiguration
Die Flysystem-Integrationen von Laravel funktionieren hervorragend mit FTP; eine Beispielkonfiguration ist jedoch nicht in der Standardkonfigurationsdatei filesystems.php
des Frameworks enthalten. Wenn Sie ein FTP-Dateisystem konfigurieren müssen, können Sie das folgende Konfigurationsbeispiel verwenden:
'ftp' => ,
SFTP-Treiberkonfiguration
Laravels Flysystem-Integrationen funktionieren hervorragend mit SFTP; eine Beispielkonfiguration ist jedoch nicht in der standardmäßigen filesystems.php
-Konfigurationsdatei des Frameworks enthalten. Wenn Sie ein SFTP-Dateisystem konfigurieren müssen, können Sie das folgende Konfigurationsbeispiel verwenden:
'sftp' => ,
Caching
Um das Caching für eine bestimmte Festplatte zu aktivieren, können Sie eine cache
-Direktive zu den Konfigurationsoptionen der Festplatte hinzufügen. Die cache
-Option sollte ein Array von Caching-Optionen sein, das den disk
-Namen, die expire
-Zeit in Sekunden und den Cache prefix
:
's3' => ,],
Erhalt von Festplatteninstanzen
Die Storage
-Fassade kann zur Interaktion mit jeder Ihrer konfigurierten Festplatten verwendet werden. Sie können zum Beispiel die Methode put
der Fassade verwenden, um einen Avatar auf der Standardfestplatte zu speichern. Wenn Sie Methoden der Storage
-Fassade aufrufen, ohne vorher die disk
-Methode aufzurufen, wird die Methode automatisch an die Standardfestplatte übergeben:
use Illuminate\Support\Facades\Storage;Storage::put('avatars/1', $content);
Wenn Ihre Anwendung mit mehreren Datenträgern interagiert, können Sie die disk
-Methode auf der Storage
-Fassade verwenden, um mit Dateien auf einem bestimmten Datenträger zu arbeiten:
Storage::disk('s3')->put('avatars/1', $content);
Abrufen von Dateien
Die get
-Methode kann verwendet werden, um den Inhalt einer Datei abzurufen. Die Methode gibt den Inhalt der Datei als Rohzeichenfolge zurück. Denken Sie daran, dass alle Dateipfade relativ zum „Stammverzeichnis“ des Datenträgers angegeben werden sollten:
$contents = Storage::get('file.jpg');
Die Methode exists
kann verwendet werden, um festzustellen, ob eine Datei auf dem Datenträger existiert:
if (Storage::disk('s3')->exists('file.jpg')) { // ...}
Die missing
-Methode kann verwendet werden, um festzustellen, ob eine Datei auf der Festplatte fehlt:
if (Storage::disk('s3')->missing('file.jpg')) { // ...}
Downloading Files
Die download
-Methode kann verwendet werden, um eine Antwort zu erzeugen, die den Browser des Benutzers zwingt, die Datei unter dem angegebenen Pfad herunterzuladen. Die Methode download
akzeptiert einen Dateinamen als zweites Argument der Methode, der den Dateinamen bestimmt, der vom Benutzer beim Herunterladen der Datei gesehen wird. Schließlich können Sie ein Array von HTTP-Headern als drittes Argument an die Methode übergeben:
return Storage::download('file.jpg');return Storage::download('file.jpg', $name, $headers);
Datei-URLs
Sie können die Methode url
verwenden, um die URL für eine bestimmte Datei zu erhalten. Wenn Sie den local
-Treiber verwenden, wird in der Regel einfach /storage
dem angegebenen Pfad vorangestellt und eine relative URL zur Datei zurückgegeben. Wenn Sie den s3
-Treiber verwenden, wird die vollständig qualifizierte Remote-URL zurückgegeben:
use Illuminate\Support\Facades\Storage;$url = Storage::url('file.jpg');
Wenn Sie den local
-Treiber verwenden, sollten alle Dateien, die öffentlich zugänglich sein sollen, im Verzeichnis storage/app/public
abgelegt werden. Außerdem sollten Sie unter public/storage
einen symbolischen Link erstellen, der auf das Verzeichnis storage/app/public
verweist.
{Anmerkung} Bei Verwendung des
local
-Treibers ist der Rückgabewert vonurl
nicht URL-kodiert. Aus diesem Grund empfehlen wir, Ihre Dateien immer unter Namen zu speichern, die gültige URLs erzeugen.
Temporäre URLs
Mit der Methode temporaryUrl
können Sie temporäre URLs zu Dateien erstellen, die mit dem Treiber s3
gespeichert wurden. Diese Methode akzeptiert einen Pfad und eine DateTime
-Instanz, die angibt, wann die URL ablaufen soll:
use Illuminate\Support\Facades\Storage;$url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5));
Wenn Sie zusätzliche S3-Anforderungsparameter angeben müssen, können Sie das Array der Anforderungsparameter als drittes Argument an die temporaryUrl
-Methode übergeben:
$url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5), );
URL-Host-Anpassung
Wenn Sie den Host für URLs, die mit der Storage
-Fassade generiert werden, vordefinieren möchten, können Sie eine url
-Option zum Konfigurations-Array der Platte hinzufügen:
'public' => ,
Datei-Metadaten
Neben dem Lesen und Schreiben von Dateien kann Laravel auch Informationen über die Dateien selbst bereitstellen. Zum Beispiel kann die size
-Methode verwendet werden, um die Größe einer Datei in Bytes zu erhalten:
use Illuminate\Support\Facades\Storage;$size = Storage::size('file.jpg');
Die lastModified
-Methode gibt den UNIX-Zeitstempel der letzten Änderung der Datei zurück:
$time = Storage::lastModified('file.jpg');
Dateipfade
Sie können die path
-Methode verwenden, um den Pfad für eine bestimmte Datei zu erhalten. Wenn Sie den local
-Treiber verwenden, wird der absolute Pfad zur Datei zurückgegeben. Wenn Sie den s3
-Treiber verwenden, gibt diese Methode den relativen Pfad zur Datei im S3-Bucket zurück:
use Illuminate\Support\Facades\Storage;$path = Storage::path('file.jpg');
Speichern von Dateien
Die put
-Methode kann verwendet werden, um Dateiinhalte auf einer Festplatte zu speichern. Sie können auch ein PHP resource
an die put
-Methode übergeben, das die zugrunde liegende Stream-Unterstützung von Flysystem nutzen wird. Denken Sie daran, dass alle Dateipfade relativ zum „Root“-Speicherort angegeben werden sollten, der für den Datenträger konfiguriert wurde:
use Illuminate\Support\Facades\Storage;Storage::put('file.jpg', $contents);Storage::put('file.jpg', $resource);
Automatisches Streaming
Das Streaming von Dateien in den Speicher bietet eine deutlich geringere Speichernutzung. Wenn Sie möchten, dass Laravel das Streaming einer bestimmten Datei zu Ihrem Speicherort automatisch verwaltet, können Sie die Methode putFile
oder putFileAs
verwenden. Diese Methode akzeptiert entweder eine Illuminate\Http\File
– oder Illuminate\Http\UploadedFile
-Instanz und streamt die Datei automatisch an den gewünschten Speicherort:
use Illuminate\Http\File;use Illuminate\Support\Facades\Storage;// Automatically generate a unique ID for filename...$path = Storage::putFile('photos', new File('/path/to/photo'));// Manually specify a filename...$path = Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
Es gibt ein paar wichtige Dinge über die putFile
-Methode zu beachten. Beachten Sie, dass wir nur einen Verzeichnisnamen und keinen Dateinamen angegeben haben. Standardmäßig erzeugt die Methode putFile
eine eindeutige ID, die als Dateiname dient. Die Dateierweiterung wird durch Prüfung des MIME-Typs der Datei ermittelt. Der Pfad zur Datei wird von der Methode putFile
zurückgegeben, so dass Sie den Pfad einschließlich des generierten Dateinamens in Ihrer Datenbank speichern können.
Die Methoden putFile
und putFileAs
akzeptieren auch ein Argument, um die „Sichtbarkeit“ der gespeicherten Datei anzugeben. Dies ist besonders nützlich, wenn Sie die Datei auf einem Cloud-Datenträger wie Amazon S3 speichern und möchten, dass die Datei über generierte URLs öffentlich zugänglich ist:
Storage::putFile('photos', new File('/path/to/photo'), 'public');
Vorbereiten &Anhängen an Dateien
Mit den Methoden prepend
und append
können Sie an den Anfang oder das Ende einer Datei schreiben:
Storage::prepend('file.log', 'Prepended Text');Storage::append('file.log', 'Appended Text');
Kopieren & Verschieben von Dateien
Die Methode copy
kann verwendet werden, um eine vorhandene Datei an einen neuen Ort auf der Festplatte zu kopieren, während die Methode move
verwendet werden kann, um eine vorhandene Datei umzubenennen oder an einen neuen Ort zu verschieben:
Storage::copy('old/file.jpg', 'new/file.jpg');Storage::move('old/file.jpg', 'new/file.jpg');
Dateiuploads
In Webanwendungen ist einer der häufigsten Anwendungsfälle für die Speicherung von Dateien die Speicherung von vom Benutzer hochgeladenen Dateien wie Fotos und Dokumente. Laravel macht es sehr einfach, hochgeladene Dateien mit der Methode store
auf einer hochgeladenen Dateiinstanz zu speichern. Rufen Sie die Methode store
mit dem Pfad auf, unter dem Sie die hochgeladene Datei speichern möchten:
<?phpnamespace App\Http\Controllers;use App\Http\Controllers\Controller;use Illuminate\Http\Request;class UserAvatarController extends Controller{ /** * Update the avatar for the user. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Http\Response */ public function update(Request $request) { $path = $request->file('avatar')->store('avatars'); return $path; }}
Es gibt ein paar wichtige Dinge, die bei diesem Beispiel zu beachten sind. Beachten Sie, dass wir nur einen Verzeichnisnamen, nicht aber einen Dateinamen angegeben haben. Standardmäßig erzeugt die Methode store
eine eindeutige ID, die als Dateiname dient. Die Dateierweiterung wird durch Prüfung des MIME-Typs der Datei ermittelt. Der Pfad zur Datei wird von der Methode store
zurückgegeben, so dass Sie den Pfad, einschließlich des generierten Dateinamens, in Ihrer Datenbank speichern können.
Sie können auch die putFile
-Methode auf der Storage
-Fassade aufrufen, um die gleiche Dateispeicherung wie im obigen Beispiel durchzuführen:
$path = Storage::putFile('avatars', $request->file('avatar'));
Angabe eines Dateinamens
Wenn Sie nicht möchten, dass Ihrer gespeicherten Datei automatisch ein Dateiname zugewiesen wird, können Sie die storeAs
-Methode verwenden, die den Pfad, den Dateinamen und (optional) die Festplatte als Argumente erhält:
$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id);
Sie können auch die putFileAs
-Methode auf der Storage
-Fassade verwenden, die den gleichen Dateispeichervorgang wie im obigen Beispiel durchführt:
$path = Storage::putFileAs( 'avatars', $request->file('avatar'), $request->user()->id);
{Anmerkung} Nicht druckbare und ungültige Unicode-Zeichen werden automatisch aus den Dateipfaden entfernt. Daher sollten Sie Ihre Dateipfade bereinigen, bevor Sie sie an die Dateispeichermethoden von Laravel übergeben. Dateipfade werden mit der
League\Flysystem\Util::normalizePath
-Methode normalisiert.
Spezifizieren eines Datenträgers
Standardmäßig verwendet die store
-Methode dieser hochgeladenen Datei Ihren Standard-Datenträger. Wenn Sie einen anderen Datenträger angeben möchten, übergeben Sie den Namen des Datenträgers als zweites Argument an die store
-Methode:
$path = $request->file('avatar')->store( 'avatars/'.$request->user()->id, 's3');
Wenn Sie die storeAs
-Methode verwenden, können Sie den Namen des Datenträgers als drittes Argument an die Methode übergeben:
$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id, 's3');
Andere Informationen über die hochgeladene Datei
Wenn Sie den ursprünglichen Namen der hochgeladenen Datei erhalten möchten, können Sie dies mit der getClientOriginalName
-Methode tun:
$name = $request->file('avatar')->getClientOriginalName();
Die extension
-Methode kann verwendet werden, um die Dateierweiterung der hochgeladenen Datei zu erhalten:
$extension = $request->file('avatar')->extension();
Dateisichtbarkeit
In der Flysystem-Integration von Laravel ist „Sichtbarkeit“ eine Abstraktion von Dateiberechtigungen über mehrere Plattformen. Dateien können entweder als public
oder private
deklariert werden. Wenn eine Datei als public
deklariert wird, geben Sie an, dass die Datei generell für andere zugänglich sein soll. Wenn Sie beispielsweise den S3-Treiber verwenden, können Sie URLs für public
-Dateien abrufen.
Sie können die Sichtbarkeit beim Schreiben der Datei über die Methode put
einstellen:
use Illuminate\Support\Facades\Storage;Storage::put('file.jpg', $contents, 'public');
Wenn die Datei bereits gespeichert wurde, kann ihre Sichtbarkeit über die Methoden getVisibility
und setVisibility
abgerufen und eingestellt werden:
$visibility = Storage::getVisibility('file.jpg');Storage::setVisibility('file.jpg', 'public');
Bei der Interaktion mit hochgeladenen Dateien können Sie die Methoden storePublicly
und storePubliclyAs
verwenden, um die hochgeladene Datei mit public
Sichtbarkeit zu speichern:
$path = $request->file('avatar')->storePublicly('avatars', 's3');$path = $request->file('avatar')->storePubliclyAs( 'avatars', $request->user()->id, 's3');
Lokale Dateien & Sichtbarkeit
Bei der Verwendung des Treibers local
entspricht die public
Sichtbarkeit 0755
Berechtigungen für Verzeichnisse und 0644
Berechtigungen für Dateien. Sie können die Berechtigungszuordnungen in der filesystems
Konfigurationsdatei Ihrer Anwendung ändern:
'local' => , 'dir' => , ],],
Löschen von Dateien
Die delete
Methode akzeptiert einen einzelnen Dateinamen oder ein Array von zu löschenden Dateien:
use Illuminate\Support\Facades\Storage;Storage::delete('file.jpg');Storage::delete();
Wenn nötig, können Sie den Datenträger angeben, von dem die Datei gelöscht werden soll:
use Illuminate\Support\Facades\Storage;Storage::disk('s3')->delete('path/file.jpg');
Verzeichnisse
Alle Dateien in einem Verzeichnis abrufen
Die Methode files
gibt ein Array aller Dateien in einem bestimmten Verzeichnis zurück. Wenn Sie eine Liste aller Dateien innerhalb eines bestimmten Verzeichnisses einschließlich aller Unterverzeichnisse abrufen möchten, können Sie die Methode allFiles
verwenden:
use Illuminate\Support\Facades\Storage;$files = Storage::files($directory);$files = Storage::allFiles($directory);
Get All Directories Within A Directory
Die Methode directories
gibt ein Array aller Verzeichnisse innerhalb eines bestimmten Verzeichnisses zurück. Zusätzlich kann man die Methode allDirectories
verwenden, um eine Liste aller Verzeichnisse innerhalb eines gegebenen Verzeichnisses und aller seiner Unterverzeichnisse zu erhalten:
$directories = Storage::directories($directory);$directories = Storage::allDirectories($directory);
Erstelle ein Verzeichnis
Die Methode makeDirectory
erstellt das gegebene Verzeichnis, einschließlich aller benötigten Unterverzeichnisse:
Storage::makeDirectory($directory);
Löschen eines Verzeichnisses
Schließlich kann die Methode deleteDirectory
verwendet werden, um ein Verzeichnis und alle dazugehörigen Dateien zu entfernen:
Storage::deleteDirectory($directory);
Benutzerdefinierte Dateisysteme
Die Flysystem-Integration von Laravel bietet von Haus aus Unterstützung für mehrere „Treiber“; Flysystem ist jedoch nicht auf diese beschränkt und verfügt über Adapter für viele andere Speichersysteme. Sie können einen benutzerdefinierten Treiber erstellen, wenn Sie einen dieser zusätzlichen Adapter in Ihrer Laravel-Anwendung verwenden möchten.
Um ein benutzerdefiniertes Dateisystem zu definieren, benötigen Sie einen Flysystem-Adapter. Fügen wir einen von der Community gepflegten Dropbox-Adapter zu unserem Projekt hinzu:
composer require spatie/flysystem-dropbox
Als Nächstes können Sie den Treiber innerhalb der boot
-Methode eines der Service-Provider Ihrer Anwendung registrieren. Dazu sollten Sie die extend
-Methode der Storage
-Fassade verwenden:
<?phpnamespace App\Providers;use Illuminate\Support\Facades\Storage;use Illuminate\Support\ServiceProvider;use League\Flysystem\Filesystem;use Spatie\Dropbox\Client as DropboxClient;use Spatie\FlysystemDropbox\DropboxAdapter;class AppServiceProvider extends ServiceProvider{ /** * Register any application services. * * @return void */ public function register() { // } /** * Bootstrap any application services. * * @return void */ public function boot() { Storage::extend('dropbox', function ($app, $config) { $client = new DropboxClient( $config ); return new Filesystem(new DropboxAdapter($client)); }); }}
Das erste Argument der extend
-Methode ist der Name des Treibers und das zweite ist ein Abschluss, der die Variablen $app
und $config
erhält. Die Closure muss eine Instanz von League\Flysystem\Filesystem
zurückgeben. Die $config
-Variable enthält die in config/filesystems.php
definierten Werte für den angegebenen Datenträger.
Wenn Sie den Dienstanbieter der Erweiterung erstellt und registriert haben, können Sie den dropbox
-Treiber in Ihrer config/filesystems.php
-Konfigurationsdatei verwenden.
Leave a Reply