Filopbevaring
- Indledning
- Konfiguration
- Den lokale driver
- Den offentlige disk
- Forudsætninger for driveren
- Caching
- Hentning af diskinstanser
- Hentning af filer
- Hentning af filer
- Fil URL’er
- Filmetadata om filer
- Lagring af filer
- Opload af filer
- Filers synlighed
- Sletning af filer
- Kataloger
- Brugerdefineret Filsystemer
Indledning
Laravel tilbyder en kraftfuld filsystemabstraktion takket være den vidunderlige Flysystem PHP-pakke af Frank de Jonge. Laravel Flysystem-integrationen giver enkle drivere til at arbejde med lokale filsystemer, SFTP og Amazon S3. Endnu bedre, det er forbløffende enkelt at skifte mellem disse lagringsmuligheder mellem din lokale udviklingsmaskine og produktionsserveren, da API’en forbliver den samme for hvert system.
Konfiguration
Larawels filsystemkonfigurationsfil ligger på config/filesystems.php
. I denne fil kan du konfigurere alle dine filsystem-“diske” i filsystemet. Hver disk repræsenterer en bestemt lagerdriver og lagringssted. Eksempelkonfigurationer for hver understøttet driver er inkluderet i konfigurationsfilen, så du kan ændre konfigurationen, så den afspejler dine lagringspræferencer og legitimationsoplysninger.
Driveren local
interagerer med filer, der er gemt lokalt på den server, der kører Laravel-applikationen, mens s3
-driveren bruges til at skrive til Amazons S3-skylagringstjeneste.
{tip} Du kan konfigurere så mange diske, som du vil, og du kan endda have flere diske, der bruger den samme driver.
Den lokale driver
Når du bruger local
-driveren, er alle filoperationer relative til den root
-mappe, der er defineret i din filesystems
-konfigurationsfil. Som standard er denne værdi indstillet til mappen storage/app
. Derfor ville følgende metode skrive til storage/app/example.txt
:
use Illuminate\Support\Facades\Storage;Storage::disk('local')->put('example.txt', 'Contents');
Den offentlige disk
Den public
disk, der er inkluderet i dit programs filesystems
konfigurationsfil filesystems
, er beregnet til filer, der skal være offentligt tilgængelige. Som standard bruger public
-disken local
-driveren og gemmer sine filer i storage/app/public
.
For at gøre disse filer tilgængelige fra internettet skal du oprette et symbolsk link fra public/storage
til storage/app/public
. Ved at bruge denne mappekonvention holder du dine offentligt tilgængelige filer i én mappe, som nemt kan deles på tværs af implementeringer, når du bruger nul-nedgangstids-implementeringssystemer som Envoyer.
For at oprette det symbolske link kan du bruge kommandoen storage:link
Artisan:
php artisan storage:link
Når en fil er blevet gemt, og det symbolske link er blevet oprettet, kan du oprette en URL til filerne ved hjælp af asset
-hjælperen:
echo asset('storage/file.txt');
Du kan konfigurere yderligere symbolske links i din filesystems
-konfigurationsfil. Hvert af de konfigurerede links vil blive oprettet, når du kører kommandoen storage:link
:
'links' => ,
Driverforudsætninger
Composer-pakker
Hvor du bruger S3- eller SFTP-driverne, skal du installere den relevante pakke via Composer-pakkehåndteringsprogrammet:
- Amazon S3:
league/flysystem-aws-s3-v3 ~1.0
- SFTP:
league/flysystem-sftp ~1.0
Dertil kommer, at du kan vælge at installere en cachelagret adapter for at øge ydeevnen:
- CachedAdapter:
- CachedAdapter:
league/flysystem-cached-adapter ~1.0
S3-driverkonfiguration
Informationerne om S3-driverkonfiguration findes i din
config/filesystems.php
konfigurationsfil. Denne fil indeholder et eksempel på et konfigurationsarray for en S3-driver. Du er velkommen til at ændre dette array med din egen S3-konfiguration og dine egne legitimationsoplysninger. For nemheds skyld svarer disse miljøvariabler til den navngivningskonvention, der anvendes af AWS CLI.FTP-driverkonfiguration
Laravels Flysystem-integrationer fungerer godt med FTP; der er dog ikke inkluderet en prøvekonfiguration i rammens standard
filesystems.php
konfigurationsfil. Hvis du skal konfigurere et FTP-filsystem, kan du bruge nedenstående konfigurationseksempel:'ftp' => ,
SFTP-driverkonfiguration
Laravels Flysystem-integrationer fungerer godt med SFTP; der er dog ikke medtaget en prøvekonfiguration i frameworkets standardkonfigurationsfil
filesystems.php
. Hvis du skal konfigurere et SFTP-filsystem, kan du bruge nedenstående konfigurationseksempel:'sftp' => ,
Caching
For at aktivere caching for en given disk, kan du tilføje et
cache
-direktiv til diskens konfigurationsindstillinger.cache
-indstillingen skal være et array af cachingindstillinger, der indeholderdisk
-navnet,expire
-tiden i sekunder og cachenprefix
:'s3' => ,],
Obtaining Disk Instances
Facaden
Storage
kan bruges til at interagere med alle dine konfigurerede diske. Du kan f.eks. brugeput
-metoden på facaden til at gemme en avatar på standarddisken. Hvis du kalder metoder påStorage
-facaden uden først at kaldedisk
-metoden, vil metoden automatisk blive overført til standarddisken:use Illuminate\Support\Facades\Storage;Storage::put('avatars/1', $content);
Hvis dit program interagerer med flere diske, kan du bruge
disk
-metoden påStorage
-facaden til at arbejde med filer på en bestemt disk:Storage::disk('s3')->put('avatars/1', $content);
Hentning af filer
Metoden
get
kan bruges til at hente indholdet af en fil. Det rå strengindhold af filen returneres af metoden. Husk, at alle filstier skal angives relativt til diskens “rod”-placering:$contents = Storage::get('file.jpg');
Metoden
exists
kan bruges til at bestemme, om en fil findes på disken:if (Storage::disk('s3')->exists('file.jpg')) { // ...}
Metoden
missing
kan bruges til at fastslå, om en fil mangler på disken:if (Storage::disk('s3')->missing('file.jpg')) { // ...}
Hentning af filer
Metoden
download
kan bruges til at generere et svar, der tvinger brugerens browser til at hente filen på den angivne sti.download
-metoden accepterer et filnavn som det andet argument til metoden, som vil bestemme det filnavn, der ses af brugeren, der downloader filen. Endelig kan du sende et array af HTTP-headers som tredje argument til metoden:return Storage::download('file.jpg');return Storage::download('file.jpg', $name, $headers);
Fil URL’er
Du kan bruge
url
-metoden til at få URL’en for en given fil. Hvis du brugerlocal
-driveren, vil dette typisk bare sætte/storage
foran den givne sti og returnere en relativ URL til filen. Hvis du brugers3
-driveren, returneres den fuldt kvalificerede fjern-URL:use Illuminate\Support\Facades\Storage;$url = Storage::url('file.jpg');
Når du bruger
local
-driveren, skal alle filer, der skal være offentligt tilgængelige, placeres i mappenstorage/app/public
. Desuden bør du oprette et symbolsk link påpublic/storage
, som peger på mappenstorage/app/public
.{note} Når du bruger
local
-driveren, er returværdien afurl
ikke URL-kodet. Derfor anbefaler vi, at du altid gemmer dine filer ved hjælp af navne, der skaber gyldige URL’er.Temporære URL’er
Med metoden
temporaryUrl
kan du oprette midlertidige URL’er til filer, der er gemt ved hjælp afs3
-driveren. Denne metode accepterer en sti og enDateTime
-instans, der angiver, hvornår URL’en skal udløbe:use Illuminate\Support\Facades\Storage;$url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5));
Hvis du har brug for at angive yderligere S3-anmodningsparametre, kan du sende arrayet af anmodningsparametre som det tredje argument til
temporaryUrl
-metoden:$url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5), );
URL Host Customization
Hvis du ønsker at foruddefinere værten for URL’er, der genereres ved hjælp af
Storage
-facaden, kan du tilføje enurl
indstilling til diskens konfigurationsarray:'public' => ,
File Metadata
Ud over at læse og skrive filer kan Laravel også give oplysninger om selve filerne. For eksempel kan
size
-metoden bruges til at få størrelsen af en fil i bytes:use Illuminate\Support\Facades\Storage;$size = Storage::size('file.jpg');
Metoden
lastModified
returnerer UNIX-tidsstemplet for sidste gang, filen blev ændret:$time = Storage::lastModified('file.jpg');
Filstier
Du kan bruge
path
-metoden til at få stien til en given fil. Hvis du brugerlocal
-driveren, returnerer denne metode den absolutte sti til filen. Hvis du brugers3
-driveren, returnerer denne metode den relative sti til filen i S3-spanden:use Illuminate\Support\Facades\Storage;$path = Storage::path('file.jpg');
Lagring af filer
Metoden
put
kan bruges til at lagre filindholdet på en disk. Du kan også sende en PHPresource
tilput
-metoden, som vil bruge Flysystems underliggende stream-understøttelse. Husk, at alle filstier skal angives relativt til den “rod”-placering, der er konfigureret for disken:use Illuminate\Support\Facades\Storage;Storage::put('file.jpg', $contents);Storage::put('file.jpg', $resource);
Automatisk streaming
Automatisk streaming
Streaming af filer til lagring giver et betydeligt reduceret hukommelsesforbrug. Hvis du ønsker, at Laravel automatisk skal administrere streaming af en given fil til din lagerplacering, kan du bruge metoden
putFile
ellerputFileAs
. Denne metode accepterer enten enIlluminate\Http\File
– ellerIlluminate\Http\UploadedFile
-instans og vil automatisk streame filen til den ønskede placering: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');
Der er et par vigtige ting at bemærke om
putFile
-metoden. Bemærk, at vi kun har angivet et mappenavn og ikke et filnavn. Som standard vilputFile
-metoden generere et unikt ID, der skal fungere som filnavn. Filens udvidelse vil blive bestemt ved at undersøge filens MIME-type. Stien til filen returneres afputFile
-metoden, så du kan gemme stien, herunder det genererede filnavn, i din database.Metoderne
putFile
ogputFileAs
accepterer også et argument til at angive “synligheden” af den lagrede fil. Dette er især nyttigt, hvis du gemmer filen på en clouddisk, f.eks. Amazon S3, og gerne vil have, at filen skal være offentligt tilgængelig via genererede URL’er:Storage::putFile('photos', new File('/path/to/photo'), 'public');
Forberedelse & Tilføjelse til filer
Med metoderne
prepend
ogappend
kan du skrive til begyndelsen eller slutningen af en fil:Storage::prepend('file.log', 'Prepended Text');Storage::append('file.log', 'Appended Text');
Kopiering & Flytning af filer
Metoden
copy
kan bruges til at kopiere en eksisterende fil til en ny placering på disken, mens metodenmove
kan bruges til at omdøbe eller flytte en eksisterende fil til en ny placering:Storage::copy('old/file.jpg', 'new/file.jpg');Storage::move('old/file.jpg', 'new/file.jpg');
Filopload
I webapplikationer er et af de mest almindelige anvendelsesområder for lagring af filer lagring af brugeroploadede filer som f.eks. fotos og dokumenter. Laravel gør det meget nemt at gemme uploadede filer ved hjælp af
store
-metoden på en uploadet filinstans. Kaldstore
-metoden med den sti, hvor du ønsker at gemme den uploadede fil:<?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; }}
Der er et par vigtige ting at bemærke om dette eksempel. Bemærk, at vi kun har angivet et mappenavn, ikke et filnavn. Som standard vil
store
-metoden generere et unikt ID, der skal fungere som filnavn. Filens udvidelse vil blive bestemt ved at undersøge filens MIME-type. Stien til filen returneres afstore
-metoden, så du kan gemme stien, herunder det genererede filnavn, i din database.Du kan også kalde
putFile
-metoden påStorage
-facaden for at udføre den samme fillagringsoperation som i eksemplet ovenfor:$path = Storage::putFile('avatars', $request->file('avatar'));
Angivelse af et filnavn
Hvis du ikke ønsker, at der automatisk tildeles et filnavn til din lagrede fil, kan du bruge
storeAs
-metoden, som modtager stien, filnavnet og (valgfri) disk som argumenter:$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id);
Du kan også bruge
putFileAs
-metoden påStorage
-facaden, som vil udføre den samme fillagringsoperation som i eksemplet ovenfor:$path = Storage::putFileAs( 'avatars', $request->file('avatar'), $request->user()->id);
{note} Uudskrivelige og ugyldige unicode-tegn vil automatisk blive fjernet fra filstierne. Derfor kan du ønske at rense dine filstier, før du sender dem til Laravels filopbevaringsmetoder. Filstier normaliseres ved hjælp af
League\Flysystem\Util::normalizePath
-metoden.Specificering af en disk
Som standard vil denne uploadede fil’s
store
-metode bruge din standarddisk. Hvis du ønsker at angive en anden disk, skal du sende disknavnet som andet argument tilstore
-metoden:$path = $request->file('avatar')->store( 'avatars/'.$request->user()->id, 's3');
Hvis du bruger
storeAs
-metoden, kan du sende disknavnet som tredje argument til metoden:$path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id, 's3');
Andre oplysninger om den uploadede fil
Hvis du ønsker at få det oprindelige navn på den uploadede fil, kan du gøre det ved hjælp af
getClientOriginalName
-metoden:$name = $request->file('avatar')->getClientOriginalName();
Metoden
extension
kan bruges til at få filudvidelsen for den uploadede fil:$extension = $request->file('avatar')->extension();
Filsynlighed
I Laravels Flysystem-integration er “synlighed” en abstraktion af filtilladelser på tværs af flere platforme. Filer kan enten være deklareret
public
ellerprivate
. Når en fil er erklæretpublic
, angiver du, at filen generelt skal være tilgængelig for andre. Når du f.eks. bruger S3-driveren, kan du hente URL’er forpublic
-filer.Du kan indstille synligheden, når du skriver filen via
put
-metoden:use Illuminate\Support\Facades\Storage;Storage::put('file.jpg', $contents, 'public');
Hvis filen allerede er blevet gemt, kan dens synlighed hentes og indstilles via
getVisibility
– ogsetVisibility
-metoderne:$visibility = Storage::getVisibility('file.jpg');Storage::setVisibility('file.jpg', 'public');
Når du interagerer med uploadede filer, kan du bruge metoderne
storePublicly
ogstorePubliclyAs
til at gemme den uploadede fil medpublic
synlighed:$path = $request->file('avatar')->storePublicly('avatars', 's3');$path = $request->file('avatar')->storePubliclyAs( 'avatars', $request->user()->id, 's3');
Lokale filer & Synlighed
Når du bruger
local
-driveren, oversættespublic
synlighed til0755
-tilladelser for mapper og0644
-tilladelser for filer. Du kan ændre tilladelsestilknytningerne ifilesystems
-konfigurationsfilen for dit program:'local' => , 'dir' => , ],],
Sletning af filer
Metoden
delete
accepterer et enkelt filnavn eller et array af filer, der skal slettes:use Illuminate\Support\Facades\Storage;Storage::delete('file.jpg');Storage::delete();
Hvis det er nødvendigt, kan du angive den disk, som filen skal slettes fra:
use Illuminate\Support\Facades\Storage;Storage::disk('s3')->delete('path/file.jpg');
Directories
Hent alle filer i en mappe
Metoden
files
returnerer et array af alle filer i en given mappe. Hvis du ønsker at hente en liste over alle filer i en given mappe, herunder alle undermapper, kan du bruge metodenallFiles
:use Illuminate\Support\Facades\Storage;$files = Storage::files($directory);$files = Storage::allFiles($directory);
Get All Directories Within A Directory
Metoden
directories
returnerer et array af alle mapper i en given mappe. Derudover kan du brugeallDirectories
-metoden til at få en liste over alle mapper inden for en given mappe og alle dens undermapper:$directories = Storage::directories($directory);$directories = Storage::allDirectories($directory);
Opret en mappe
Metoden
makeDirectory
opretter den givne mappe, herunder alle nødvendige undermapper:Storage::makeDirectory($directory);
Slet en mappe
Slutteligt kan
deleteDirectory
-metoden bruges til at fjerne en mappe og alle dens filer:Storage::deleteDirectory($directory);
Specifikke filsystemer
Laravels Flysystem-integration giver understøttelse for flere “drivere” out of the box; Flysystem er dog ikke begrænset til disse og har adaptere til mange andre lagringssystemer. Du kan oprette en brugerdefineret driver, hvis du ønsker at bruge en af disse ekstra adaptere i din Laravel-applikation.
For at definere et brugerdefineret filsystem skal du bruge en Flysystem-adapter. Lad os tilføje en Dropbox-adapter, der er vedligeholdt af fællesskabet, til vores projekt:
composer require spatie/flysystem-dropbox
Næst kan du registrere driveren i
boot
-metoden i en af din applikations tjenesteudbydere. For at opnå dette skal du brugeextend
-metoden iStorage
-facade:<?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ørste argument i
extend
-metoden er navnet på driveren, og det andet er en lukning, der modtager$app
– og$config
-variablerne. Lukningen skal returnere en instans afLeague\Flysystem\Filesystem
. Variablen$config
indeholder de værdier, der er defineret iconfig/filesystems.php
for den angivne disk.Når du har oprettet og registreret udvidelsens tjenesteudbyder, kan du bruge
dropbox
-driveren i dinconfig/filesystems.php
-konfigurationsfil. - CachedAdapter:
Leave a Reply