Articles

Håndtering af filoverførsler i Laravel – CodeSource.io

næsten alle applikationer har at gøre med filoverførsel af en slags: et profilbillede, et dokument til KYC-verifikation, et dokument, der indeholder CV osv.

derfor er det vigtigt at forstå, hvordan man håndterer filoverførsler i Laravel.

i denne vejledning skal vi opbygge en simpel brugerprofilformular, hvor brugeren skal udfylde sine detaljer, og disse detaljer vil omfatte indsendelse af et profilbillede.

i slutningen af denne tutorial skal du være i stand til at håndtere filoverførsler, håndtere filoverførselsvalidering og vide, hvad du skal gøre, når filen ikke uploades med succes.

opsætning

for at komme i gang skal Laravel installeres på dit system. Hvis du allerede har Laravel installeret, kan du springe dette trin over.

jeg vil råde dig til at installere Laravel globalt. Især hvis du planlægger at bruge det ofte. Du kan gøre det ved at køre følgende kommando på en terminal.

composer global require laravel/installer

når det er færdigt, kan vi fortsætte med at oprette et nyt Laravel-projekt til denne tutorial.

laravel new profile-form

kørsel af ovenstående kommando opretter et nyt Laravel-projekt i den aktuelle mappe kaldet profile-form.

Server appen ved at køre følgende:

cd profile-formphp artisan serve

Naviger til , hvor du finder din app, der viser standard Laravel-destinationssiden.

skrivning af Databasemigrering

vi bliver nødt til at oprette en brugertabel, der gemmer brugeroplysninger.Laravel sender med en migrering til brugertabellen, som kan findes på database\migrations14_10_12_000000_create_users_table.php. Rediger den fil for at se sådan ud:

her har vi ændret standard Laravel-migreringen for brugertabellen for at inkludere et feltfoto, der gemmer URL ‘ en til brugernes fotografi.

ændre .env-fil til at omfatte de korrekte database detaljer. Kør derefter migreringerne ved at køre følgende kommando:

php artisan migrate

Opdater Brugermodellen for at afspejle tilføjelsen af fotofeltet. Tilføj foto til $fillable, så det kan udfyldes automatisk af laravel, når du opretter og opdaterer en bruger.

// App\User.phpprotected $fillable = ;

når det er gjort, kan vi fortsætte med at opbygge frontenden af profilformularen.

opbygning af Frontend

vi bliver nødt til at oprette et godkendelsessystem, der giver brugeren mulighed for at registrere og logge ind i applikationen.

Opret en ny fil i ressourcer/visninger kaldet register.blade.php. Føj følgende til den nyoprettede fil.

vi bruger bootstrap til styling, derfor behovet for at tilføje det til den øverste del af siden. Vi har lavet alle de krævede felter her, så brugeren ikke kan indsende formularen uden at udfylde alle felterne.

det felt, der er særligt vigtigt for os her, er filindtastningsfeltet <input type="file" opdatering.php for at inkludere ruten til registersiden

// web.php...Route::get('/register', function () { return view('register');});

gå til viser registersiden, der indeholder de felter, der er typiske for en registreringsformular.

fil upload formular

vi skal angive den type filer, der understøttes. Da vi kun vil have billedfiler, skal vi angive i inputelementet, at vi kun vil have billedfiler.

Modfiy input:type="file" for kun at acceptere billedfiler ved at tilføje acceptattributten med en værdi på image/* til input-tagget.

fotografiafsnittet skal nu lide:

mens formularen ser ud til at sende billeder til backend, kan den ikke gøre det endnu. Vi er nødt til at fortælle formularen, at den bliver nødt til at sende en anden type formulardata til backend, i dette tilfælde binære data.

det gør vi ved at tilføje attributten enctype til formularelementet og indstille værdien til multipart/form-data.

åbningsformularmærket skal se ud:

<form action="#" class="col-md-5" enctype="multipart/form-data">

Dernæst skal vi skrive controlleren for at håndtere uploaden.

skrivning af controlleren

vores backend skal være i stand til at håndtere Validering, lagring og omdirigering/godkendelse af brugeren.

Laravel skibe med en RegisterController, som kan findes på app\Http\Controllers\Auth\RegisterController.php.

Validering

validator metoden i registeransvarlig har til opgave at validere felterne. Så lad os opdatere det for at afspejle, hvad vi rent faktisk ønsker.

ændre valideringsmetoden i RegisterController.php til at validere alle vores felter.

feltet Navn skal være et påkrævet felt og en streng, deraf valideringsreglerne. Det samme gælder e-mail og adgangskode.

adgangskodefeltet skal bekræftes. I frontend tilføjede vi et felt til adgangskodebekræftelse. Dette er, hvad adgangskodefeltet sammenlignes med. Endelig fotofeltet.

dette felt er påkrævet ved registrering. Det er nødvendigt, fordi vi i vores databasemigrering gjorde det sådan. Hvis vi havde indstillet det til at være ugyldigt, ville vi ikke have brug for at indstille valideringen til påkrævet.

Laravel har også en praktisk valideringsregel, image, som bruges til at validere billedfiler (filer med en af følgende udvidelser: jpeg, png, bmp, gif eller svg).

en anden validering, som du måske ønsker at blive udført på filer, er

  • at sikre, at filstørrelsen ikke er større eller mindre end et bestemt beløb. Denne regel kan tilføjes som max:500 eller min:500 efter behov. Det skal bemærkes, at filstørrelsen her er i kilobyte
  • kontrol af billedets dimensioner. Dette kan gøres ved at tilføje følgende til rækken af regler 'dimensions:min_width=100,min_height=200'.

lagring

det næste trin er lagring af billedet. Vi opretter en ny funktion til at håndtere denne funktionalitet.

der er flere steder, hvor filer kan gemmes i en applikation: de kan gemmes i en S3-spand, google Drev eller endda i din applikationsserver.

Laravel leveres med understøttelse af lagring af filer på disse steder. For nemheds skyld gemmer vi billedfilen i applikationen.

Laravel anmodning klasse, Illuminate\Http\Request giver støtte til filhåndtering ud af boksen. Den uploadede fil kan gemmes via $request→file(<inputName>)→store(<folderToBeStored>). For vores sag kunne vi bruge:

$request->file('photo')->store('profile')

dette gemmer filen i mappen lager \app\profile. Filen gemmes med et tilfældigt navn, og url ‘ en til filen returneres.

hvis vi vil tildele et brugerdefineret navn til billedet, når det gemmes, skal vi bruge metoden storeAs.

brug af storeAs – metoden vil se ud

$request→file(<inputName>)→storeAs(<folderToBeStored>, <customName.fileExtension>)

filtypen er vigtig, og laravel giver enkle måder at få filtypen til den fil, der blev uploadet, via clientExtension – metoden.

det kan fås som vist nedenfor

$request->file('photo')->extension()

ved hjælp af denne metode kan vi gemme en brugers billede baseret på brugerens navn.

$fileName = $request->get('name') . '.' . $request->file('photo')->extension(); $request->file('photo')->storeAs('profile', $fileName);

i vores tilfælde kan vi nøjes med de tilfældige navne, som laravel gemmer vores fil.

  • for at få adgang til din fil offentligt, skal den gemmes i mappen storage/app/public.
  • filer i andre mapper vil ikke være offentligt tilgængelige

lad os oprette en funktion, der håndterer opgaven med at gemme billeder til lageret.

under validatorfunktionen skal du tilføje følgende

funktionen storeImagegemmer billedet i mappen storage/app/public/profile og returnerer en URL til filens lagerplacering.

at sætte det hele sammen

da vi tilføjer flere ting, der skal gøres, er vi nødt til at tilsidesætte standardregistermetoden, som laravel har givet os.

Laravel giver et træk til registrering af brugere og kan findes på Illuminate\Foundation\Auth\RegistersUsers.php.

Opdater registeransvarlig til at omfatte følgende:

som det ses ovenfor, gør Opret-funktionen arbejdet med at oprette en bruger baseret på de data, der sendes til den.

registerfunktionen er, hvor alt sker. Valideringen udføres først før nogen anden ting.

hvis valideringen er bestået, gemmer vi billedet. Når det er gjort, opretter vi brugeren ved at videregive alle de data, der er nødvendige i et array, $data.

hvis alt sker med succes, godkender vi brugeren og omdirigerer til hjemmesiden.

viser det uploadede billede

hjemmesiden er hvor vi vil vise alle brugeroplysninger. Lad os først oprette en rute og controller til den.

på terminalen skal du køre koden for at generere HomeController.

php artisan make:controller HomeController

gå til den nyoprettede HomeController, og tilføj følgende metoder til klassen.

i konstruktøren definerer vi, at vi bruger auth-mellemvaren. Hvad denne mellemvare gør er, at den kun tillader autoriserede brugere at få adgang til funktioner, der er defineret i klassen.

derfor kan brugeren kun komme her, hvis han er godkendt. Hvis brugeren ikke er godkendt, omdirigeres han til login-siden.

Vis-funktionen håndterer visning af startsiden. Vi sender også den godkendte bruger til visningen. For at lære mere om dette, skal du kontrollere Laravel-dokumentationen.

Opdater rutefilen, så den indeholder hjemruten.

// web.php...Route::get('/home', '[email protected]')->name('home');

endelig oprette et hjem.klinge.php fil i resources/views mappe.

tilføj følgende til hjemmet.klinge.php:

i visningsfilen har vi adgang til de user data, der blev sendt fra controlleren.

vi bruger i øjeblikket et pladsholderbillede til at vise brugerens foto, fordi billedet i øjeblikket ikke er tilgængeligt for os.

vi er nødt til at oprette et symbolsk link fra public/storage til storage/app/public mappe til Laravel gør dette enkelt ved at give håndværkskommandoen:

php artisan storage:link

når du har gjort det, skal du opdatere billedmærket for at vise profilbilledet.

<img src="https://codesource.io/handling-file-uploads-in-laravel/amp/{{asset('storage/'.$user->photo)}}" class="card-img-top" alt="...">

Tillykke!!! Du har med succes lært at gemme billeder i laravel.

konklusion

næsten alle applikationer kræver lagring af filer på en eller anden måde. Efter ovenstående vejledning skal du være i stand til at gemme billeder og enhver anden fil til det lokale lager.Al den kode, der bruges her, kan findes her på Github.