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 public
disk 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 avurl
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