Dateispeicherung
Dateispeicherung Lagerung
- Einführung
- Konfiguration
- Festplatteninstanz abrufen
- Datei abrufen
- Datei speichern
- Dateien löschen
- Verzeichnis
- Benutzerdefiniertes Dateisystem
Einführung
Laravel Bietet dank Frank de Jonges leistungsstarkem Flysystem-Erweiterungspaket eine leistungsstarke Dateisystemabstraktion. Die Laravel-Dateisystemintegration bietet benutzerfreundliche Treiber für die Arbeit mit lokalen Dateisystemen, Amazon S3 und Rackspace-Cloud-Speicher. Noch besser: Der Wechsel zwischen diesen Speicheroptionen ist einfach, da die API für jedes System gleich bleibt.
Konfiguration Die Konfigurationsdatei für das Dateisystem
befindet sich in config/filesystems.php
. In dieser Datei können Sie alle „Festplatten“ konfigurieren. Jede Festplatte stellt ein bestimmtes Speicherlaufwerk und einen bestimmten Speicherort dar. Beispielkonfigurationen für jeden unterstützten Treiber sind in den Konfigurationsdateien enthalten. Ändern Sie daher einfach die Konfiguration, um Ihre Speichereinstellungen und Anmeldeinformationen widerzuspiegeln.
Natürlich können Sie nach Bedarf mehrere Festplatten konfigurieren und sogar dafür sorgen, dass mehrere Festplatten denselben Treiber nutzen.
Öffentlicher Datenträger
public
Der Datenträger ist für Dateien vorgesehen, die öffentlich zugänglich sein sollen. Standardmäßig verwendet die Festplatte public
den Treiber local
und speichert diese Dateien im Verzeichnis storage/app/public
. Um sie über das Netzwerk zugänglich zu machen, müssen Sie einen symbolischen Link von public/storage
nach storage/app/public
erstellen. Bei diesem Ansatz bleiben öffentlich zugängliche Dateien im selben Verzeichnis, sodass sie problemlos zwischen Bereitstellungen geteilt werden können, wenn ein Bereitstellungssystem ohne Ausfallzeiten wie Envoyer verwendet wird. Sie können den Artisan-Befehl storage:link
verwenden, um einen symbolischen Link zu erstellen:
Sie können den Artisan-Befehl storage:link
verwenden, um einen symbolischen Link zu erstellen:
php artisan storage:link
Natürlich, sobald eine Datei vorhanden ist gespeichert und erstellt wurde. Symbolischer Link, Sie können die Hilfsfunktion asset
verwenden, um die Datei zu erstellen URL:
echo asset('storage/file.txt');
Lokaler Treiber
Bei Verwendung des local
-Treibers sind alle Dateivorgänge die gleichen wie was Sie konfiguriert haben Relevant für das in der Datei definierte Verzeichnis root
. Der Standardwert für dieses Verzeichnis ist storage/app
. Daher speichert die folgende Methode die Datei in storage/app/file.txt
:
Storage::disk('local')->put('file.txt', 'Contents');
Treibervoraussetzungen
Composer-Paket
wird verwendet Bevor Sie Treiber wie SFTP, S3 oder Rackspace installieren, müssen Sie das entsprechende Softwarepaket über Composer installieren:
- SFTP:
league/flysystem-sftp ~1.0
- Amazon S3:
league/flysystem-aws-s3-v3 ~1.0
- Rackplatz:
league/flysystem-rackspace ~1.0
Die Verwendung eines Cache-Adapters ist ein absolutes Muss, um die Leistung zu verbessern. Sie benötigen ein zusätzliches Paket:
- CachedAdapter:
league/flysystem-cached-adapter ~1.0
S3-Treiberkonfiguration
Informationen zur S3-Treiberkonfiguration finden Sie in Ihrer config/filesystems.php
Konfigurationsdatei. Diese Datei enthält ein Beispielkonfigurationsarray für den S3-Treiber. Es steht Ihnen frei, dieses Array mit Ihrer eigenen S3-Konfiguration und Ihren eigenen Anmeldeinformationen zu ändern. Der Einfachheit halber entsprechen diese Umgebungsvariablen der von der AWS CLI verwendeten Namenskonvention.
FTP-Treiberkonfiguration
Die Dateisystemintegration von Laravel kann FTP sehr gut unterstützen, aber das FTP-Konfigurationsbeispiel ist nicht in der standardmäßigen filesystems.php
-Dateimitte des Frameworks enthalten. Bei Bedarf können Sie die folgende Beispielkonfiguration verwenden:
'ftp' => [ 'driver' => 'ftp', 'host' => 'ftp.example.com', 'username' => 'your-username', 'password' => 'your-password', // 可选的 FTP 配置项... // 'port' => 21, // 'root' => '', // 'passive' => true, // 'ssl' => true, // 'timeout' => 30, ],
Konfiguration des SFTP-Treibers
Laravels Flysystem-Integrationspaket funktioniert sehr gut mit SFTP; in der Standardkonfigurationsdatei des Frameworks ist jedoch keine Beispielkonfiguration enthalten filesystems.php
. Wenn Sie ein SFTP-Dateisystem konfigurieren möchten, können Sie die folgende Beispielkonfiguration verwenden:
'sftp' => [ 'driver' => 'sftp', 'host' => 'example.com', 'username' => 'your-username', 'password' => 'your-password', // 基于 SSH 密钥的身份验证设置... // 'privateKey' => '/path/to/privateKey', // 'password' => 'encryption-password', // 可选的 SFTP 配置... // 'port' => 22, // 'root' => '', // 'timeout' => 30, ],
Rackspace-Laufwerkskonfiguration
Laravels Flysystem-Integrationspaket funktioniert sehr gut mit Rackspace; Die Standardkonfigurationsdatei filesystems.php
des Frameworks enthält jedoch keine Beispielkonfigurationen. Wenn Sie das Rackspace-Dateisystem konfigurieren möchten, können Sie die folgende Beispielkonfiguration verwenden:
'rackspace' => [ 'driver' => 'rackspace', 'username' => 'your-username', 'key' => 'your-key', 'container' => 'your-container', 'endpoint' => 'https://identity.api.rackspacecloud.com/v2.0/', 'region' => 'IAD', 'url_type' => 'publicURL', ],
Cache
Um das Caching für die angegebene Festplattenfunktion zu aktivieren, müssen Sie cache
direkt zum Konfigurationselement der Festplatte hinzufügen. Die Option cache
sollte ein Array von Cache-Konfigurationen sein, gesteuert durch den Cache-Namen store
(Anmerkung des Übersetzers: Der ursprüngliche Beschreibungstext des Dokuments disk
stimmt nicht mit dem store
im Beispielcode überein. Nach Überprüfung des Code, es sollte tatsächlich store
sein, diese Änderung wurde vorgenommen), die Ablaufzeit in Sekunden expire
und das Cache-Präfix prefix
. Zusammensetzung:
's3' => [ 'driver' => 's3', // 驱动器其他配置... 'cache' => [ 'store' => 'memcached', 'expire' => 600, 'prefix' => 'cache-prefix', ], ],
Festplatteninstanz abrufen
Storage
Fassade kann zur Interaktion mit jeder konfigurierten Festplatte verwendet werden. Sie können beispielsweise die put
-Methode in der Fassade verwenden, um einen Avatar auf der Standardfestplatte zu speichern. Wenn Sie eine Methode in der Storage
-Fassade verwenden, ohne zunächst die disk
-Methode zu verwenden, wird die aufgerufene Methode automatisch an die Standardfestplatte übergeben:
use Illuminate\Support\Facades\Storage; Storage::put('avatars/1', $fileContents);
Wenn die Anwendung mit mehreren zusammenarbeiten soll Bei Datenträgern können Sie das Storage
in der disk
-Fassade verwenden Methoden arbeiten mit Dateien auf einer bestimmten Festplatte:
Storage::disk('s3')->put('avatars/1', $fileContents);
Dateien abrufen Die Methode
get
kann verwendet werden Rufen Sie den Inhalt einer Datei ab. Diese Methode gibt den ursprünglichen Zeichenfolgeninhalt der Datei zurück. Denken Sie daran, dass alle Dateipfade relativ zum für die Festplatte konfigurierten „Stamm“-Verzeichnis angegeben werden sollten:
$contents = Storage::get('file.jpg');
exists
Mit der Methode kann festgestellt werden, ob die angegebene Datei auf der Festplatte vorhanden ist:
$exists = Storage::disk('s3')->exists('file.jpg');
Datei herunterladen
download
-Methode Kann verwendet werden, um eine Antwort zu generieren, die den Browser des Benutzers zwingt, eine Datei unter einem bestimmten Pfad herunterzuladen. Die download
-Methode akzeptiert einen Dateinamen als zweiten Parameter der Methode, der den Dateinamen bestimmt, den der Benutzer sieht, wenn er die Datei herunterlädt. Schließlich können Sie der Methode als drittes Argument einen HTTP-Array-Header übergeben:
return response()->download('file.jpg'); return response()->download('file.jpg', $name, $headers);
Datei-URLs
Sie können die url
-Methode verwenden, um die URL einer bestimmten Datei abzurufen. Wenn Sie den local
-Treiber verwenden, ist es üblich, einfach /storage
zum angegebenen Pfad hinzuzufügen und eine relative URL zu dieser Datei zurückzugeben. Wenn Sie den s3
- oder rackspace
-Treiber verwenden, wird die vollständige Remote-URL zurückgegeben:
use Illuminate\Support\Facades\Storage; $url = Storage::url('file.jpg');
{note} Denken Sie daran, wenn Sie den
local
-Treiber verwenden, werden alle Daten angezeigt Ich möchte öffentlich sein. Alle Dateien, auf die zugegriffen wird, sollten im Verzeichnisstorage/app/public
abgelegt werden. Zusätzlich sollten Sie einen Symlinkpublic/storage
in erstellen, der auf das Verzeichnisstorage/app/public
verweist.
Temporäre URLs
Wenn Sie den Treiber s3
oder rackspace
zum Speichern von Dateien verwenden, können Sie mit der Methode temporaryUrl
eine temporäre URL erstellen URL für eine bestimmte Datei. Diese Methode empfängt den Pfad und die DateTime
-Instanz, um anzugeben, wann die URL abläuft:
$url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5) );
Benutzerdefinierter lokaler URL-Host
Wenn Sie local
verwenden möchten Treiber für die Speicherung Um Hosts in einer Datei auf der Festplatte vorzudefinieren, können Sie ein url
zum Festplattenkonfigurationsarray hinzufügen Optionen:
'public' => [ 'driver' => 'local', 'root' => storage_path('app/public'), 'url' => env('APP_URL').'/storage', 'visibility' => 'public', ],
Dateimetadaten
Zusätzlich zum Lesen und Schreiben von Dateien kann Laravel auch Informationen über die bereitstellen Dateien selbst. Informationen, zum Beispiel size
Die Methode kann verwendet werden, um die Größe einer Datei in Bytes zu ermitteln:
use Illuminate\Support\Facades\Storage; $size = Storage::size('file.jpg');
lastModified
Die Methode gibt UNIX zurück, wann die Datei das letzte Mal geändert wurde Zeitstempel:
$time = Storage::lastModified('file.jpg');
Datei speichern
put
Die Methode kann verwendet werden, um den ursprünglichen Dateiinhalt auf der Festplatte zu speichern . Sie können PHPs resource
auch an die Methode put
übergeben, die die zugrunde liegende Stream-Unterstützung im Dateisystem verwendet. Bei der Arbeit mit großen Dateien wird dringend empfohlen, diese Methode zu verwenden:
use Illuminate\Support\Facades\Storage; Storage::put('file.jpg', $contents); Storage::put('file.jpg', $resource);
Automatisches Streaming
Wenn Sie möchten, dass Laravel eine bestimmte Datei automatisch an Ihren Speicherort streamt, können Sie die Methode putFile
oder putFileAs
verwenden. Diese Methode benötigt eine IlluminateHttpFile
- oder IlluminateHttpUploadedFile
-Instanz und streamt die Datei automatisch an den gewünschten Speicherort:
use Illuminate\Http\File; use Illuminate\Support\Facades\Storage; // 自动为文件名生成唯一的ID... Storage::putFile('photos', new File('/path/to/photo')); // 手动指定文件名... Storage::putFileAs('photos', new File('/path/to/photo'), 'photo.jpg');
Bei der putFile
-Methode sind einige Dinge zu beachten. Wir geben einen Verzeichnisnamen anstelle eines Dateinamens an. Standardmäßig generiert die Methode putFile
eine eindeutige ID als Dateinamen. Die Dateierweiterung wird anhand des MIME-Typs der erkannten Datei bestimmt. Die Methode putFile
gibt den Dateipfad zurück, sodass Sie den Dateipfad (einschließlich des generierten Dateinamens) in der Datenbank speichern können. Die Methoden
putFile
und putFileAs
akzeptieren auch eine Methode zur Angabe der „Sichtbarkeit“ der gespeicherten Datei. Wenn Sie eine Datei auf einer Cloud-Festplatte wie S3 speichern und möchten, dass die Datei öffentlich zugänglich ist, können Sie die folgende Funktion verwenden:
Storage::putFile('photos', new File('/path/to/photo'), 'public');
Dateidaten schreiben
prepend
und append
Mit Methoden können Sie Daten am Anfang oder Ende einer Datei schreiben:
Storage::prepend('file.log', 'Prepended Text'); Storage::append('file.log', 'Appended Text');
Dateien kopieren und verschieben Die Methode
copy
wird zum Kopieren einer Datei verwendet ein neuer Speicherort auf der Festplatte und move
Methoden zum Umbenennen oder Verschieben von Dateien an einen neuen Speicherort:
Storage::copy('old/file.jpg', 'new/file.jpg'); Storage::move('old/file.jpg', 'new/file.jpg');
Datei-Upload
in einer Webanwendung, die Das am häufigsten verwendete Dateispeicherszenario ist das Hochladen von Avataren, Fotos und Dateien. Mit der Instanzmethode von Laravel zum Hochladen von Dateien store
können Probleme beim Hochladen und Speichern von Dateien problemlos gelöst werden. Sie müssen lediglich die Methode store
mit dem Dateispeicherpfad als Parameter aufrufen:
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Http\Controllers\Controller; class UserAvatarController extends Controller{ /** * 更新用户头像. * * @param Request $request * @return Response */ public function update(Request $request) { $path = $request->file('avatar')->store('avatars'); return $path; } }
Im obigen Beispiel sind einige Punkte zu beachten. Wir geben den Verzeichnisnamen an, nicht den Dateinamen. Standardmäßig generiert die Methode store
automatisch eine eindeutige ID als Dateinamen. Die Erweiterung der Datei wird durch Überprüfen des MIME-Typs der Datei ermittelt. Der Pfad und der Dateiname der Datei werden von der Methode store
für die spätere Datenbankspeicherung zurückgegeben.
Sie können auch die Storage
-Methode auf der putFile
-Fassade verwenden, um den gleichen Effekt wie im obigen Beispiel zu erzielen:
$path = Storage::putFile('avatars', $request->file('avatar'));
Geben Sie den Dateinamen an
Wenn Sie nicht möchten, dass der Dateiname automatisch der gespeicherten Datei zugewiesen wird, können Sie die Methode storeAs
verwenden, die einen Pfad, einen Dateinamen usw. akzeptiert (Optional) Festplatte als Parameter:
$path = $request->file('avatar')->storeAs('avatars', $request->user()->id);
Sie können die Storage
-Methode auf der putFileAs
-Fassade verwenden, um den gleichen Dateivorgang wie im obigen Beispiel zu erreichen:
$path = Storage::putFileAs('avatars', $request->file('avatar'), $request->user()->id);
Datenträger angeben
Standardmäßig verwendet die store
-Methode den Standarddatenträger. Wenn Sie eine andere Festplatte angeben müssen, können Sie den Festplattennamen als zweiten Parameter der store
-Methode übergeben:
$path = $request->file('avatar')->store('avatars/'.$request->user()->id, 's3');
Dateisichtbarkeit
in Laravel In einem integrierten Dateisystem ist „Sichtbarkeit“ eine Abstraktion von Dateiberechtigungen über mehrere Plattformen hinweg. Dateien können als public
oder private
deklariert werden. Wenn eine Datei als public
deklariert ist, bedeutet dies, dass andere darauf zugreifen können. Wenn Sie beispielsweise den S3-Treiber verwenden, können Sie Dateien abrufen, die als public
deklariert sind.
Sie können die Sichtbarkeit einer Datei über die put
-Methode festlegen:
use Illuminate\Support\Facades\Storage; Storage::put('file.jpg', $contents, 'public');
getVisibility
und setVisibility
Methoden können die Sichtbarkeit vorhandener Dateien abfragen und festlegen:
$visibility = Storage::getVisibility('file.jpg'); Storage::setVisibility('file.jpg', 'public')
Datei löschen
delete
Die Methode erhält einen Dateinamen oder Dateinamen in Form eines Arrays zum Löschen von Dateien auf der Festplatte:
use Illuminate\Support\Facades\Storage; Storage::delete('file.jpg'); Storage::delete(['file.jpg', 'file2.jpg']);
Bei Bedarf können Sie den Festplattennamen angeben, um die Dateien darunter zu löschen:
use Illuminate\Support\Facades\Storage; Storage::disk('s3')->delete('folder_path/file_name.jpg');
Verzeichnis
Alle Dateien im Verzeichnis abrufen
files
Die Methode gibt alle Dateien im angegebenen Verzeichnis zurück. Wenn Sie eine Liste aller Dateien in einem bestimmten Verzeichnis (einschließlich Unterverzeichnissen) abrufen möchten, können Sie die Methode allFiles
verwenden:
use Illuminate\Support\Facades\Storage; $files = Storage::files($directory); $files = Storage::allFiles($directory);
Alle Verzeichnisse im Verzeichnis abrufen
directories
Die Methode gibt ein Array aller Verzeichnisse unter dem angegebenen Verzeichnis zurück. Darüber hinaus können Sie die Methode allDirectories
verwenden, um eine Liste aller Verzeichnisse in einem bestimmten Verzeichnis und seinen Unterverzeichnissen abzurufen:
$directories = Storage::directories($directory); // 递归... $directories = Storage::allDirectories($directory);
Verzeichnis erstellen
makeDirectory
Die Methode erstellt rekursiv das Verzeichnis:
Storage::makeDirectory($directory);
Verzeichnis löschen
deleteDirectory
Die Methode löscht das angegebene Verzeichnis und alle darin enthaltenen Dateien:
Storage::deleteDirectory($directory);
Benutzerdefiniertes Dateisystem
Obwohl das Dateisystem von Laravel einige Treiber sofort bereitstellt, ist es nicht auf diese beschränkt und bietet auch Adapter für andere Dateisysteme. Diese Adapter ermöglichen die Erstellung benutzerdefinierter Treiber innerhalb von Lavarel-Anwendungen.
Um ein benutzerdefiniertes Dateisystem einzurichten, benötigen Sie einen Flysystem-Adapter. Fügen wir nun den von der Community verwalteten Dropbox-Adapter zum Projekt hinzu:
composer require spatie/flysystem-dropbox
Als nächstes müssen Sie einen Dienstanbieter mit dem Namen DropboxServiceProvider
erstellen. Verwenden Sie in der boot
-Methode die Storage
-Methode der extend
-Fassade, um den Treiber anzupassen:
<?php namespace App\Providers; use Storage;use League\Flysystem\Filesystem; use Illuminate\Support\ServiceProvider; use Spatie\Dropbox\Client as DropboxClient; use Spatie\FlysystemDropbox\DropboxAdapter; class DropboxServiceProvider extends ServiceProvider{ /** * 执行注册后引导驱动. * * @return void */ public function boot() { Storage::extend('dropbox', function ($app, $config) { $client = new DropboxClient( $config['authorization_token'] ); return new Filesystem(new DropboxAdapter($client)); }); } /** * 在容器中注册绑定. * * @return void */ public function register() { // } }
extend
Der erste Parameter der Methode ist der Name des Treibers und der zweite Parameter Das Abschlusspaket akzeptiert die Variablen $app
und $config
. Dieser Abschluss muss eine Instanz von LeagueFlysystemFilesystem
zurückgeben. Die Variable $config
enthält die Position der Festplatte innerhalb von config/filesystems.php
.
Als nächstes registrieren Sie den Dienstanbieter in der config/app.php
Konfigurationsdatei:
'providers' => [ // ... App\Providers\DropboxServiceProvider::class, ];
Nachdem Sie den Dienstanbieter erstellt und registriert haben, können Sie ihn in der config/filesystems.php
Konfigurationsdatei dropbox
hinzufügen Treiber herunterladen und verwenden.