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.phpkonfigurationsfil. 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 indeholder disk-navnet, expire-tiden i sekunder og cachen prefix:

    's3' => ,],

    Obtaining Disk Instances

    Facaden Storage kan bruges til at interagere med alle dine konfigurerede diske. Du kan f.eks. bruge put-metoden på facaden til at gemme en avatar på standarddisken. Hvis du kalder metoder på Storage-facaden uden først at kalde disk-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 bruger local-driveren, vil dette typisk bare sætte /storage foran den givne sti og returnere en relativ URL til filen. Hvis du bruger s3-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 mappen storage/app/public. Desuden bør du oprette et symbolsk link på public/storage, som peger på mappen storage/app/public.

    {note} Når du bruger local-driveren, er returværdien af url 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 af s3-driveren. Denne metode accepterer en sti og en DateTime-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 en url 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 bruger local-driveren, returnerer denne metode den absolutte sti til filen. Hvis du bruger s3-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 PHP resource til put-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 eller putFileAs. Denne metode accepterer enten en Illuminate\Http\File– eller Illuminate\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 vil putFile-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 af putFile-metoden, så du kan gemme stien, herunder det genererede filnavn, i din database.

    Metoderne putFile og putFileAs 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 og append 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 metoden move 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. Kald store-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 af store-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 til store-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 eller private. Når en fil er erklæret public, 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 for public-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– og setVisibility-metoderne:

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

    Når du interagerer med uploadede filer, kan du bruge metoderne storePublicly og storePubliclyAs til at gemme den uploadede fil med public 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ættes public synlighed til 0755-tilladelser for mapper og 0644-tilladelser for filer. Du kan ændre tilladelsestilknytningerne i filesystems-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 metoden allFiles:

    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 bruge allDirectories-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 bruge extend-metoden i Storage-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 af League\Flysystem\Filesystem. Variablen $config indeholder de værdier, der er defineret i config/filesystems.php for den angivne disk.

    Når du har oprettet og registreret udvidelsens tjenesteudbyder, kan du bruge dropbox-driveren i din config/filesystems.php-konfigurationsfil.

Leave a Reply