Fillagring

  • Inledning
  • Konfiguration
    • Den lokala drivrutinen
    • Den offentliga disken
    • Förutsättningar för drivrutinen
    • Caching
  • Ansamling av diskinstanser
  • Hämtning av filer
    • Hämtning av filer
    • Filens URL:er
    • Filmetadata
  • Lagring av filer
    • Uppladdning av filer
    • Synliggörande av filer
  • Radera filer
  • Kataloger
  • Anpassat Filsystem

Introduktion

Laravel erbjuder en kraftfull abstraktion av filsystem tack vare det underbara PHP-paketet Flysystem av Frank de Jonge. Laravel Flysystem-integrationen tillhandahåller enkla drivrutiner för arbete med lokala filsystem, SFTP och Amazon S3. Ännu bättre är att det är otroligt enkelt att växla mellan dessa lagringsalternativ mellan din lokala utvecklingsmaskin och produktionsserver eftersom API:et förblir detsamma för varje system.

Konfiguration

Larvels filsystemkonfigurationsfil finns på config/filesystems.php. I den här filen kan du konfigurera alla dina ”diskar” i filsystemet. Varje disk representerar en viss lagringsdrivrutin och lagringsplats. Exempelkonfigurationer för varje drivrutin som stöds ingår i konfigurationsfilen så att du kan ändra konfigurationen så att den återspeglar dina lagringspreferenser och autentiseringsuppgifter.

Drivrutinen local interagerar med filer som lagras lokalt på servern som kör Laravel-applikationen medan drivrutinen s3 används för att skriva till Amazons molnlagringstjänst S3.

{tip} Du kan konfigurera så många diskar som du vill och kan till och med ha flera diskar som använder samma drivrutin.

Den lokala drivrutinen

När du använder local-drivrutinen är alla filoperationer relativa till root-katalogen som definieras i din filesystems-konfigurationsfil. Som standard är detta värde inställt på katalogen storage/app. Därför skulle följande metod skriva till storage/app/example.txt:

use Illuminate\Support\Facades\Storage;Storage::disk('local')->put('example.txt', 'Contents');

Den offentliga disken

Den publicdisk som ingår i din applikations filesystems-konfigurationsfil är avsedd för filer som kommer att vara allmänt tillgängliga. Som standard använder public-disken drivrutinen local och lagrar sina filer i storage/app/public.

För att göra dessa filer tillgängliga från webben bör du skapa en symbolisk länk från public/storage till storage/app/public. Genom att använda denna mappkonvention håller du dina offentligt tillgängliga filer i en katalog som enkelt kan delas mellan distributioner när du använder distributionssystem med noll stilleståndstid som Envoyer.

För att skapa den symboliska länken kan du använda kommandot storage:link Artisan:

php artisan storage:link

När en fil har lagrats och den symboliska länken har skapats kan du skapa en URL till filerna med hjälp av asset-hjälpen:

echo asset('storage/file.txt');

Du kan konfigurera ytterligare symboliska länkar i din filesystems-konfigurationsfil. Var och en av de konfigurerade länkarna kommer att skapas när du kör kommandot storage:link:

'links' => ,

Drivrutinens förutsättningar

Composer-paket

För att kunna använda S3- eller SFTP-drivrutinerna måste du installera lämpligt paket via Composer-pakethanteraren:

  • Amazon S3: league/flysystem-aws-s3-v3 ~1.0
  • SFTP: league/flysystem-sftp ~1.0

Du kan dessutom välja att installera en cached adapter för ökad prestanda:

  • CachedAdapter: league/flysystem-cached-adapter ~1.0

S3 Driver Configuration

Informationen om S3-drivrutinens konfiguration finns i din config/filesystems.php konfigurationsfil. Den här filen innehåller en exempelkonfigurationsmatris för en S3-drivrutin. Det står dig fritt att ändra den här matrisen med din egen S3-konfiguration och dina egna autentiseringsuppgifter. För enkelhetens skull matchar dessa miljövariabler den namnkonvention som används av AWS CLI.

Konfiguration av FTP-drivrutin

Laravels Flysystem-integrationer fungerar utmärkt med FTP, men en exempelkonfiguration ingår inte i ramverkets standardkonfigurationsfil filesystems.php. Om du behöver konfigurera ett FTP-filsystem kan du använda konfigurationsexemplet nedan:

'ftp' => ,

SFTP Driver Configuration

Laravels Flysystem-integrationer fungerar utmärkt med SFTP, men en exempelkonfiguration ingår inte i ramverkets standardkonfigurationsfil filesystems.php. Om du behöver konfigurera ett SFTP-filsystem kan du använda konfigurationsexemplet nedan:

'sftp' => ,

Caching

För att aktivera caching för en viss disk kan du lägga till ett cache-direktiv i diskens konfigurationsalternativ. cache-alternativet ska vara en array av caching-alternativ som innehåller disk-namnet, expire-tiden i sekunder och cache prefix:

's3' => ,],

Obtaining Disk Instances

Fasaden Storage kan användas för att interagera med någon av dina konfigurerade diskar. Du kan till exempel använda put-metoden på fasaden för att lagra en avatar på standarddisken. Om du anropar metoder på Storage-fasaden utan att först anropa disk-metoden kommer metoden automatiskt att överföras till standarddisken:

use Illuminate\Support\Facades\Storage;Storage::put('avatars/1', $content);

Om ditt program interagerar med flera diskar kan du använda disk-metoden på Storage-fasaden för att arbeta med filer på en viss disk:

Storage::disk('s3')->put('avatars/1', $content);

Hämtning av filer

Metoden get kan användas för att hämta innehållet i en fil. Det råa stränginnehållet i filen returneras av metoden. Kom ihåg att alla filvägar ska anges relativt till diskens ”rot”-plats:

$contents = Storage::get('file.jpg');

Metoden exists kan användas för att avgöra om en fil finns på disken:

if (Storage::disk('s3')->exists('file.jpg')) { // ...}

Metoden missing kan användas för att avgöra om en fil saknas på disken:

if (Storage::disk('s3')->missing('file.jpg')) { // ...}

Hämtning av filer

Metoden download kan användas för att generera ett svar som tvingar användarens webbläsare att hämta filen på den angivna sökvägen. Metoden download accepterar ett filnamn som det andra argumentet till metoden, vilket kommer att bestämma det filnamn som ses av användaren som laddar ner filen. Slutligen kan du skicka en array av HTTP-huvuden som tredje argument till metoden:

return Storage::download('file.jpg');return Storage::download('file.jpg', $name, $headers);

Fil URL:er

Du kan använda metoden url för att få fram URL:en för en viss fil. Om du använder local-drivrutinen kommer denna metod vanligtvis bara att sätta /storage före den givna sökvägen och returnera en relativ URL till filen. Om du använder drivrutinen s3 returneras den fullständigt kvalificerade fjärr-URL:

use Illuminate\Support\Facades\Storage;$url = Storage::url('file.jpg');

När du använder drivrutinen local ska alla filer som ska vara allmänt tillgängliga placeras i katalogen storage/app/public. Dessutom bör du skapa en symbolisk länk på public/storage som pekar på katalogen storage/app/public.

{not} När drivrutinen local används är returvärdet av url inte URL-kodat. Därför rekommenderar vi att du alltid lagrar dina filer med namn som skapar giltiga URL:er.

Temporära URL:er

Med hjälp av temporaryUrl-metoden kan du skapa tillfälliga URL:er till filer som lagras med drivrutinen s3. Metoden tar emot en sökväg och en DateTime-instans som anger när URL:n ska upphöra att gälla:

use Illuminate\Support\Facades\Storage;$url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5));

Om du behöver ange ytterligare S3-förfrågningsparametrar kan du skicka arrayen med förfrågningsparametrar som det tredje argumentet till temporaryUrl-metoden:

$url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5), );

URL Host Customization

Om du vill fördefiniera värden för webbadresser som genereras med hjälp av Storage-fasaden kan du lägga till ett url-alternativ till diskens konfigurationsarray:

'public' => ,

File Metadata

Förutom att läsa och skriva filer kan Laravel också tillhandahålla information om själva filerna. Metoden size kan till exempel användas för att få fram storleken på en fil i bytes:

use Illuminate\Support\Facades\Storage;$size = Storage::size('file.jpg');

Metoden lastModified returnerar UNIX-tidsstämpeln för när filen senast ändrades:

$time = Storage::lastModified('file.jpg');

Filsökvägar

Du kan använda metoden path för att få fram sökvägen för en viss fil. Om du använder local-drivrutinen returnerar detta den absoluta sökvägen till filen. Om du använder drivrutinen s3 returnerar den här metoden den relativa sökvägen till filen i S3-hinken:

use Illuminate\Support\Facades\Storage;$path = Storage::path('file.jpg');

Lagring av filer

Metoden put kan användas för att lagra filinnehåll på en disk. Du kan också skicka en PHP resource till put-metoden, vilket kommer att använda Flysystems underliggande strömstöd. Kom ihåg att alla filvägar ska anges relativt till den ”rot”-plats som konfigurerats för disken:

use Illuminate\Support\Facades\Storage;Storage::put('file.jpg', $contents);Storage::put('file.jpg', $resource);

Automatisk strömning

Att strömma filer till lagringsutrymmet ger betydligt minskad minnesanvändning. Om du vill att Laravel automatiskt ska hantera streaming av en viss fil till lagringsplatsen kan du använda metoden putFile eller putFileAs. Den här metoden accepterar antingen en Illuminate\Http\File– eller Illuminate\Http\UploadedFile-instans och strömmar automatiskt filen till önskad plats:

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');

Det finns några viktiga saker att notera om putFile-metoden. Observera att vi endast angav ett katalognamn och inte ett filnamn. Som standard genererar putFile-metoden ett unikt ID som fungerar som filnamn. Filens förlängning kommer att bestämmas genom att undersöka filens MIME-typ. Sökvägen till filen returneras av putFile-metoden så att du kan lagra sökvägen, inklusive det genererade filnamnet, i din databas.

Metoderna putFile och putFileAs tar också emot ett argument för att specificera ”synligheten” för den lagrade filen. Detta är särskilt användbart om du lagrar filen på en molndisk som Amazon S3 och vill att filen ska vara allmänt tillgänglig via genererade URL:

Storage::putFile('photos', new File('/path/to/photo'), 'public');

Förberedelse & Lägga till filer

Med metoderna prepend och append kan du skriva till början eller slutet av en fil:

Storage::prepend('file.log', 'Prepended Text');Storage::append('file.log', 'Appended Text');

Kopiera & Flytta filer

Metoden copy kan användas för att kopiera en befintlig fil till en ny plats på disken, medan metoden move kan användas för att byta namn på eller flytta en befintlig fil till en ny plats:

Storage::copy('old/file.jpg', 'new/file.jpg');Storage::move('old/file.jpg', 'new/file.jpg');

Filuppladdning

I webbapplikationer är ett av de vanligaste användningsområdena för lagring av filer att lagra filer som laddats upp av användaren, t.ex. foton och dokument. Laravel gör det mycket enkelt att lagra uppladdade filer med hjälp av store-metoden på en uppladdad filinstans. Kalla store-metoden med sökvägen där du vill lagra den uppladdade filen:

<?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; }}

Det finns några viktiga saker att notera i det här exemplet. Observera att vi endast angav ett katalognamn, inte ett filnamn. Som standard genererar store-metoden ett unikt ID som fungerar som filnamn. Filens förlängning kommer att bestämmas genom att undersöka filens MIME-typ. Sökvägen till filen returneras av store-metoden så att du kan lagra sökvägen, inklusive det genererade filnamnet, i din databas.

Du kan också anropa putFile-metoden på Storage-fasaden för att utföra samma fillagringsoperation som i exemplet ovan:

$path = Storage::putFile('avatars', $request->file('avatar'));

Specificera ett filnamn

Om du inte vill att ett filnamn ska tilldelas automatiskt till den lagrade filen kan du använda storeAs-metoden, som tar emot sökvägen, filnamnet och (valfritt) disken som argument:

$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id);

Du kan också använda metoden putFileAs på fasaden Storage, som utför samma fillagringsoperation som exemplet ovan:

$path = Storage::putFileAs( 'avatars', $request->file('avatar'), $request->user()->id);

{not} Oskrivbara och ogiltiga Unicode-tecken tas automatiskt bort från filsökvägar. Därför kanske du vill sanera dina filvägar innan du skickar dem till Laravels fillagringsmetoder. Filsökvägar normaliseras med hjälp av League\Flysystem\Util::normalizePath-metoden.

Specificera en disk

Som standard kommer store-metoden för den här uppladdade filen att använda din standarddisk. Om du vill ange en annan disk skickar du disknamnet som det andra argumentet till store-metoden:

$path = $request->file('avatar')->store( 'avatars/'.$request->user()->id, 's3');

Om du använder storeAs-metoden kan du skicka disknamnet som det tredje argumentet till metoden:

$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id, 's3');

Övrig information om den uppladdade filen

Om du vill få fram originalnamnet på den uppladdade filen kan du göra det med getClientOriginalName-metoden:

$name = $request->file('avatar')->getClientOriginalName();

Metoden extension kan användas för att få fram filtillägget för den uppladdade filen:

$extension = $request->file('avatar')->extension();

Filsynlighet

I Laravels Flysystem-integration är ”synlighet” en abstraktion av filbehörigheter över flera plattformar. Filer kan antingen deklareras public eller private. När en fil deklareras public anger du att filen i allmänhet ska vara tillgänglig för andra. När du till exempel använder S3-drivrutinen kan du hämta URL:er för public-filer.

Du kan ställa in synligheten när du skriver filen via metoden put:

use Illuminate\Support\Facades\Storage;Storage::put('file.jpg', $contents, 'public');

Om filen redan har lagrats kan dess synlighet hämtas och ställas in via metoderna getVisibility och setVisibility:

$visibility = Storage::getVisibility('file.jpg');Storage::setVisibility('file.jpg', 'public');

När du interagerar med uppladdade filer kan du använda metoderna storePublicly och storePubliclyAs för att lagra den uppladdade filen med public synlighet:

$path = $request->file('avatar')->storePublicly('avatars', 's3');$path = $request->file('avatar')->storePubliclyAs( 'avatars', $request->user()->id, 's3');

Lokala filer & Synlighet

När du använder drivrutinen local översätts public synlighet till 0755 behörigheter för kataloger och 0644 behörigheter för filer. Du kan ändra mappningen av behörigheter i filesystems-konfigurationsfilen för ditt program:

'local' => , 'dir' => , ],],

Radera filer

Metoden delete accepterar ett enda filnamn eller en array av filer som ska raderas:

use Illuminate\Support\Facades\Storage;Storage::delete('file.jpg');Storage::delete();

Om det behövs kan du ange den disk som filen ska tas bort från:

use Illuminate\Support\Facades\Storage;Storage::disk('s3')->delete('path/file.jpg');

Directories

Get All Files Within A Directory

Metoden files returnerar en matris med alla filer i en given katalog. Om du vill hämta en lista över alla filer i en viss katalog inklusive alla underkataloger kan du använda metoden allFiles:

use Illuminate\Support\Facades\Storage;$files = Storage::files($directory);$files = Storage::allFiles($directory);

Get All Directories Within A Directory

Metoden directories returnerar en matris över alla kataloger i en viss katalog. Dessutom kan du använda metoden allDirectories för att få en lista över alla kataloger inom en given katalog och alla dess underkataloger:

$directories = Storage::directories($directory);$directories = Storage::allDirectories($directory);

Skapa en katalog

Metoden makeDirectory skapar den givna katalogen, inklusive alla nödvändiga underkataloger:

Storage::makeDirectory($directory);

Delete A Directory

Slutligen kan metoden deleteDirectory användas för att ta bort en katalog och alla dess filer:

Storage::deleteDirectory($directory);

Anpassade filsystem

Laravels Flysystem-integration ger stöd för flera ”drivrutiner” direkt ur lådan, men Flysystem är inte begränsat till dessa utan har adaptrar för många andra lagringssystem. Du kan skapa en anpassad drivrutin om du vill använda en av dessa ytterligare adaptrar i din Laravel-applikation.

För att definiera ett anpassat filsystem behöver du en Flysystem-adapter. Låt oss lägga till en Dropbox-adapter som underhålls av gemenskapen i vårt projekt:

composer require spatie/flysystem-dropbox

Nästan kan du registrera drivrutinen i boot-metoden för en av din applikations tjänsteleverantörer. För att åstadkomma detta bör du använda extend-metoden i Storage-fasaden:

<?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)); }); }}

Det första argumentet i extend-metoden är namnet på drivrutinen och det andra är en stängning som tar emot variablerna $app och $config. Stängningen måste returnera en instans av League\Flysystem\Filesystem. Variabeln $config innehåller de värden som definieras i config/filesystems.php för den angivna disken.

När du har skapat och registrerat tilläggets tjänsteleverantör kan du använda drivrutinen dropbox i din config/filesystems.php konfigurationsfil.

Leave a Reply