Articles

Manipularea încărcărilor de fișiere în Laravel – CodeSource.io

aproape toate aplicațiile au legătură cu încărcarea fișierelor de un fel: o imagine de profil, un document pentru verificarea KYC, un document care conține CV etc.

prin urmare, este important să înțelegeți cum să gestionați încărcările de fișiere în Laravel.

în acest tutorial, vom construi un formular simplu de profil de utilizator, în care utilizatorul va trebui să-și completeze detaliile și aceste detalii vor include trimiterea unei imagini de profil.

la sfârșitul acestui tutorial, ar trebui să puteți gestiona încărcările de fișiere, să gestionați validarea încărcării fișierelor și să știți ce să faceți atunci când fișierul nu este încărcat cu succes.

Configurarea

pentru a începe, Laravel trebuie să fie instalat pe sistemul dumneavoastră. Dacă aveți Laravel instalat deja, puteți sări peste acest pas.

aș sfătui să instalați Laravel la nivel global. Mai ales dacă intenționați să o utilizați des. Puteți face acest lucru executând următoarea comandă pe un terminal.

composer global require laravel/installer

odată ce este completă, putem merge mai departe pentru a crea un nou proiect Laravel pentru acest tutorial.

laravel new profile-form

rularea comenzii de mai sus va crea un nou proiect Laravel în directorul curent numit profil-formular.

servi aplicația prin rularea următoarele:

cd profile-formphp artisan serve

navigați la unde veți găsi aplicația care afișează pagina de destinație Laravel implicită.

scrierea migrării bazei de date

va trebui să creăm un tabel de utilizatori care va stoca detaliile utilizatorului.Navele Laravel cu o migrare pentru tabelul de utilizatori, care pot fi găsite la database\migrations14_10_12_000000_create_users_table.php. Modificați acel fișier pentru a arăta astfel:

aici, am modificat migrarea laravel implicită pentru tabelul utilizatori pentru a include o fotografie de câmp care va stoca adresa URL a fotografiei utilizatorilor.

modifica .fișier env pentru a include detaliile corecte ale bazei de date. Apoi executați migrațiile executând următoarea comandă:

php artisan migrate

actualizați modelul de utilizator pentru a reflecta adăugarea câmpului foto. Adăugați o fotografie la $fillable, astfel încât să poată fi completată automat de laravel la crearea și actualizarea unui utilizator.

// App\User.phpprotected $fillable = ;

după ce se face acest lucru, putem continua să construim interfața formularului de profil.

construirea interfeței

va trebui să creăm un sistem de autentificare care să permită utilizatorului să se înregistreze și să se conecteze la aplicație.

creați un fișier nou în resurse/vizualizări numit register.blade.php. Adăugați următoarele la fișierul nou creat.

noi folosim bootstrap pentru styling, prin urmare, necesitatea de a adăuga la secțiunea de sus a paginii. Am făcut toate câmpurile necesare aici, astfel încât utilizatorul să nu poată trimite formularul fără a completa toate câmpurile.

câmpul care este deosebit de important pentru noi aici este câmpul de introducere a fișierului <input type="file" actualizare web.php pentru a include ruta către pagina de înregistrare

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

mergând la va afișa pagina de înregistrare care conține câmpurile tipice unui formular de înregistrare.

formular de încărcare fișier

trebuie să specificăm tipul de fișiere acceptate. Deoarece dorim doar fișiere imagine, trebuie să specificăm în elementul de intrare că dorim doar fișiere imagine.

Modfiy input:type="file" pentru a accepta numai fișiere imagine prin adăugarea atributului accept cu o valoare de image/* la eticheta de intrare.

secțiunea fotografie ar dori acum:

în timp ce formularul pare setat pentru a trimite imagini la backend, nu se poate face asta încă. Trebuie să spunem formularului că va trebui să trimită un alt tip de date de formular către backend, în acest caz date binare.

facem acest lucru prin adăugarea atributului enctypela elementul formular și setarea valorii sale la multipart/form-data.

eticheta formularului de deschidere ar trebui să arate:

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

apoi, trebuie să scriem controlerul pentru a gestiona încărcarea.

scrierea controlerului

backend-ul nostru ar trebui să poată gestiona validarea, stocarea și redirecționarea/autentificarea utilizatorului.

Laravel este livrat cu un RegisterController care poate fi găsit la app\Http\Controllers\Auth\RegisterController.php.

validare

metoda validator din controlerul Registrului este însărcinată cu responsabilitatea validării câmpurilor. Deci, să-l actualizăm pentru a reflecta ceea ce ne dorim de fapt.

Modificați metoda validatorului în RegisterController.php pentru a valida toate câmpurile noastre.

câmpul Nume ar trebui să fie un câmp obligatoriu și un șir, de unde și regulile de validare. Similar este valabil și pentru e-mail și parolă.

câmpul parolă trebuie confirmat. În frontend, am adăugat un câmp pentru password_confirmation. Cu aceasta este comparat câmpul de parolă. În cele din urmă câmpul foto.

acest câmp este obligatoriu la înregistrare. Este necesar, deoarece în migrarea bazei noastre de date, am făcut-o așa. Dacă l-am fi setat să fie nulabil, atunci nu ar fi trebuit să setăm validarea la necesar.

Laravel are, de asemenea, o regulă de validare la îndemână, image, care este utilizată pentru a valida fișiere imagine (fișiere cu oricare dintre următoarele extensii: jpeg, png, bmp, gif sau svg).

alte validări pe care ați putea dori să le efectuați pe fișiere sunt

  • asigurându-vă că Dimensiunea fișierului nu este mai mare sau mai mică decât o anumită sumă. Această regulă poate fi adăugată ca max:500 sau min:500 după cum este necesar. Trebuie remarcat faptul că Dimensiunea fișierului aici este în kilobytes
  • verificarea dimensiunilor imaginii. Acest lucru se poate face prin adăugarea următoarelor la matricea de reguli 'dimensions:min_width=100,min_height=200'.

stocare

următorul pas este stocarea imaginii. Vom crea o nouă funcție pentru a gestiona această funcționalitate.

există mai multe locuri în care fișierele pot fi stocate într-o aplicație: acestea ar putea fi stocate într-o găleată s3, google drive sau chiar în serverul de aplicații.

Laravel vine cu suport pentru stocarea fișierelor pe aceste locații. Pentru simplitate, vom stoca fișierul imagine în aplicație.

Laravel Request class, Illuminate\Http\Request oferă suport pentru manipularea fișierelor din cutie. Fișierul încărcat poate fi stocat prin $request→file(<inputName>)→store(<folderToBeStored>). Pentru cazul nostru, am putea folosi:

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

aceasta stochează fișierul în folderul stocare \app\profile. Fișierul este salvat cu un nume aleatoriu, iar adresa url a fișierului este returnată.

dacă dorim să atribuim un nume personalizat imaginii pe măsură ce este stocată, trebuie să folosim metoda storeAs.

utilizarea metodei storeAs va arăta ca

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

extensia de fișier este importantă, iar laravel oferă modalități simple de a obține extensia de fișier a fișierului încărcat, prin metoda clientExtension.

poate fi obținut după cum se arată mai jos

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

folosind această metodă, putem salva imaginea unui utilizator pe baza numelui utilizatorului.

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

în cazul nostru, ne putem descurca cu numele aleatorii pe care laravel le salvează fișierul nostru.

  • pentru ca fișierul dvs. să fie accesat public, acesta trebuie stocat în folderul storage/app/public.
  • fișierele din alte foldere nu vor fi disponibile public

să creăm o funcție care gestionează sarcina de salvare a imaginilor în spațiul de stocare.

sub funcția validator, adăugați următoarele

funcția storeImagestochează imaginea în folderul storage/app/public/profile și returnează o adresă URL la locația de stocare a fișierului.

punând totul împreună

deoarece adăugăm mai multe lucruri de făcut, trebuie să înlocuim metoda implicită de înregistrare furnizată de laravel.

Laravel oferă o trăsătură pentru înregistrarea utilizatorilor și poate fi găsită la Illuminate\Foundation\Auth\RegistersUsers.php.

actualizați controlerul de registru pentru a include următoarele:

după cum s-a văzut mai sus, funcția Creare face munca de a crea un utilizator pe baza datelor care îi sunt trimise.

funcția de înregistrare este locul în care se întâmplă totul. Validarea este efectuată mai întâi înainte de orice alt lucru.

dacă validarea este trecută, stocăm imaginea. După ce se face, vom crea utilizatorul prin trecerea toate datele necesare într-o matrice, $data.

dacă totul se întâmplă cu succes, autentificăm utilizatorul și redirecționăm către pagina de pornire.

afișarea imaginii încărcate

pagina principală este locul în care vom afișa toate detaliile utilizatorului. În primul rând, să creăm un traseu și un controler pentru acesta.

pe terminal, executați codul pentru a genera HomeController.

php artisan make:controller HomeController

mergeți la nou creat HomeController și adăugați următoarele metode la clasă.

în constructor, definim că folosim middleware-ul auth. Ceea ce face acest middleware este că permite numai utilizatorilor autorizați să acceseze funcțiile definite în clasă.

prin urmare, utilizatorul poate veni aici numai dacă este autentificat. Dacă utilizatorul nu este autentificat, acesta este redirecționat către pagina de conectare.

funcția Afișare gestionează afișarea paginii de pornire. Trecem utilizatorul autentificat la vizualizarea, de asemenea. Pentru a afla mai multe despre acest lucru, verificați documentația laravel.

actualizați fișierul rute pentru a conține ruta acasă.

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

în cele din urmă a crea o casă.blade.fișier php în directorul resources/views.

adăugați următoarele la acasă.blade.php:

în fișierul de vizualizare, avem acces la datele user care au fost transmise de la controler.

în prezent folosim o imagine substituent pentru a afișa fotografia utilizatorului, deoarece fotografia nu este disponibilă în prezent pentru noi.

avem nevoie pentru a crea o legătură simbolică de la public/storage la storage/app/public dosar la Laravel face acest lucru simplu prin furnizarea de comanda artizan:

php artisan storage:link

după ce faceți acest lucru, actualizați eticheta de imagine pentru a afișa imaginea de profil.

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

Felicitări!!! Ați învățat cu succes cum să stocați imagini în laravel.

concluzie

aproape toate aplicațiile necesită stocarea fișierelor într-un fel sau altul. Urmând ghidul de mai sus, ar trebui să puteți stoca imagini și orice alt fișier în spațiul de stocare local.Tot codul folosit aici poate fi găsit aici pe Github.