Dateispeicherung


Dateispeicherung Lagerung

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 Verzeichnis storage/app/public abgelegt werden. Zusätzlich sollten Sie einen Symlink public/storage in erstellen, der auf das Verzeichnis storage/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.phpKonfigurationsdatei:

'providers' => [ 
   // ...   
  App\Providers\DropboxServiceProvider::class,
];

Nachdem Sie den Dienstanbieter erstellt und registriert haben, können Sie ihn in der config/filesystems.phpKonfigurationsdatei dropbox hinzufügen Treiber herunterladen und verwenden.

Dieser Artikel wurde zuerst auf der Website LearnKu.com veröffentlicht.