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 von url 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