Stocarea fișierelor

  • Introducere
  • Configurație
    • Driverul local
    • Discul public
    • Precondiții pentru driver
  • .

  • Caching
  • Obținerea instanțelor de disc
  • Recuperarea fișierelor
    • Descărcarea fișierelor
    • Url-uri de fișiere
    • Metadate de fișiere
    • Metadate de fișiere
    • .

  • Stocarea fișierelor
    • Încărcarea fișierelor
    • Vizibilitatea fișierelor
  • Ștergerea fișierelor
  • Directoare
  • Personalizate Sisteme de fișiere
  • Introducere

    Laravel oferă o abstractizare puternică a sistemului de fișiere datorită minunatului pachet Flysystem PHP de Frank de Jonge. Integrarea Flysystem din Laravel oferă drivere simple pentru lucrul cu sistemele de fișiere locale, SFTP și Amazon S3. Chiar mai bine, este uimitor de simplu să comutați între aceste opțiuni de stocare între mașina de dezvoltare locală și serverul de producție, deoarece API-ul rămâne același pentru fiecare sistem.

    Configuration

    Filierul de configurare a sistemului de fișiere al lui Laravel este localizat la config/filesystems.php. În acest fișier, puteți configura toate „discurile” sistemului de fișiere. Fiecare disc reprezintă un anumit driver de stocare și o anumită locație de stocare. În fișierul de configurare sunt incluse exemple de configurații pentru fiecare driver acceptat, astfel încât să puteți modifica configurația pentru a reflecta preferințele și acreditările dvs. de stocare.

    Driverul local interacționează cu fișierele stocate local pe serverul pe care rulează aplicația Laravel, în timp ce driverul s3 este utilizat pentru a scrie în serviciul de stocare în cloud Amazon S3.

    {tip} Puteți configura oricât de multe discuri doriți și puteți avea chiar mai multe discuri care utilizează același driver.

    The Local Driver

    Când utilizați driverul local, toate operațiunile cu fișiere sunt relative la directorul root definit în fișierul de configurare filesystems. În mod implicit, această valoare este setată la directorul storage/app. Prin urmare, următoarea metodă ar scrie în storage/app/example.txt:

    use Illuminate\Support\Facades\Storage;Storage::disk('local')->put('example.txt', 'Contents');

    Discul public

    Discul public inclus în fișierul de configurare filesystems al aplicației dumneavoastră este destinat fișierelor care vor fi accesibile publicului. În mod implicit, discul public utilizează driverul local și își stochează fișierele în storage/app/public.

    Pentru a face aceste fișiere accesibile de pe web, trebuie să creați o legătură simbolică de la public/storage la storage/app/public. Utilizarea acestei convenții de foldere va păstra fișierele accesibile publicului într-un singur director care poate fi ușor partajat între implementări atunci când se utilizează sisteme de implementare cu timp de nefuncționare zero, cum ar fi Envoyer.

    Pentru a crea legătura simbolică, puteți utiliza comanda storage:link Artisan:

    php artisan storage:link

    După ce un fișier a fost stocat și legătura simbolică a fost creată, puteți crea un URL către fișiere utilizând helperul asset:

    echo asset('storage/file.txt');

    Puteți configura legături simbolice suplimentare în fișierul de configurare filesystems. Fiecare dintre legăturile configurate va fi creată atunci când executați comanda storage:link:

    'links' => ,

    Precondiții pentru driver

    Pachete Composer

    Înainte de a utiliza driverele S3 sau SFTP, va trebui să instalați pachetul corespunzător prin intermediul managerului de pachete Composer:

    • Amazon S3: league/flysystem-aws-s3-v3 ~1.0
    • SFTP: league/flysystem-sftp ~1.0

    În plus, puteți alege să instalați un adaptor cu cache pentru o performanță sporită:

    • CachedAdapter:

    Configurarea driverului S3

    Informațiile de configurare a driverului S3 se află în fișierul dvs. de configurare config/filesystems.php. Acest fișier conține un exemplu de matrice de configurare pentru un driver S3. Sunteți liber să modificați această matrice cu propria configurație S3 și propriile acreditări. Pentru comoditate, aceste variabile de mediu se potrivesc cu convenția de denumire utilizată de AWS CLI.

    Configurarea driverului FTP

    Integrațiile Flysystem de la Laravel funcționează foarte bine cu FTP; cu toate acestea, un exemplu de configurare nu este inclus în fișierul de configurare implicit filesystems.php al framework-ului. Dacă aveți nevoie să configurați un sistem de fișiere FTP, puteți utiliza exemplul de configurare de mai jos:

    'ftp' => ,

    SFTP Driver Configuration

    Integrațiile Flysystem de la Laravel funcționează foarte bine cu SFTP; cu toate acestea, un exemplu de configurare nu este inclus cu fișierul de configurare implicit filesystems.php al framework-ului. Dacă aveți nevoie să configurați un sistem de fișiere SFTP, puteți utiliza exemplul de configurare de mai jos:

    'sftp' => ,

    Caching

    Pentru a activa caching-ul pentru un anumit disc, puteți adăuga o directivă cache la opțiunile de configurare ale discului. Opțiunea cache ar trebui să fie o matrice de opțiuni de memorare în cache care să conțină numele disk, timpul expire în secunde și cache-ul prefix:

    's3' => ,],

    Obținerea de instanțe de disc

    Fațada Storage poate fi utilizată pentru a interacționa cu oricare dintre discurile configurate. De exemplu, puteți utiliza metoda put a fațadei pentru a stoca un avatar pe discul implicit. Dacă apelați metodele de pe fațada Storage fără a apela mai întâi metoda disk, metoda va fi transmisă automat către discul implicit:

    use Illuminate\Support\Facades\Storage;Storage::put('avatars/1', $content);

    În cazul în care aplicația dvs. interacționează cu mai multe discuri, puteți utiliza metoda disk de pe fațada Storage pentru a lucra cu fișierele de pe un anumit disc:

    Storage::disk('s3')->put('avatars/1', $content);

    Retragerea fișierelor

    Metoda get poate fi utilizată pentru a prelua conținutul unui fișier. Conținutul șirului brut al fișierului va fi returnat de către metodă. Nu uitați, toate căile de acces la fișiere trebuie să fie specificate în raport cu locația „rădăcină” a discului:

    $contents = Storage::get('file.jpg');

    Metoda exists poate fi utilizată pentru a determina dacă un fișier există pe disc:

    if (Storage::disk('s3')->exists('file.jpg')) { // ...}

    Metoda missing poate fi utilizată pentru a determina dacă un fișier lipsește de pe disc:

    if (Storage::disk('s3')->missing('file.jpg')) { // ...}

    Descărcarea fișierelor

    Metoda download poate fi utilizată pentru a genera un răspuns care forțează browserul utilizatorului să descarce fișierul de la calea dată. Metoda download acceptă un nume de fișier ca al doilea argument al metodei, care va determina numele de fișier care este văzut de utilizatorul care descarcă fișierul. În cele din urmă, puteți trece o matrice de anteturi HTTP ca al treilea argument al metodei:

    return Storage::download('file.jpg');return Storage::download('file.jpg', $name, $headers);

    File URLs

    Puteți utiliza metoda url pentru a obține URL-ul pentru un fișier dat. Dacă utilizați driverul local, această metodă va preda de obicei doar /storage la calea dată și va returna un URL relativ la fișier. Dacă utilizați driverul s3, se va returna URL-ul complet calificat de la distanță:

    use Illuminate\Support\Facades\Storage;$url = Storage::url('file.jpg');

    În cazul în care se utilizează driverul local, toate fișierele care trebuie să fie accesibile publicului trebuie plasate în directorul storage/app/public. Mai mult, ar trebui să creați o legătură simbolică la public/storage care să arate spre directorul storage/app/public.

    {note} Atunci când se utilizează driverul local, valoarea de retur a url nu este codificată URL. Din acest motiv, vă recomandăm să vă stocați întotdeauna fișierele folosind nume care vor crea URL-uri valide.

    Url-uri temporare

    Utilizând metoda temporaryUrl, puteți crea URL-uri temporare către fișierele stocate folosind driverul s3. Această metodă acceptă o cale și o instanță DateTime care specifică momentul în care URL-ul ar trebui să expire:

    use Illuminate\Support\Facades\Storage;$url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5));

    Dacă aveți nevoie să specificați parametri de cerere S3 suplimentari, puteți trece matricea de parametri de cerere ca al treilea argument al metodei temporaryUrl:

    $url = Storage::temporaryUrl( 'file.jpg', now()->addMinutes(5), );

    Personalizarea gazdei URL

    Dacă doriți să predefiniți gazda pentru URL-urile generate cu ajutorul fațadei Storage, puteți adăuga o opțiune url la matricea de configurare a discului:

    'public' => ,

    Metadate despre fișiere

    În plus față de citirea și scrierea fișierelor, Laravel poate furniza, de asemenea, informații despre fișierele în sine. De exemplu, metoda size poate fi utilizată pentru a obține dimensiunea unui fișier în octeți:

    use Illuminate\Support\Facades\Storage;$size = Storage::size('file.jpg');

    Metoda lastModified returnează timestamp-ul UNIX al ultimei modificări a fișierului:

    $time = Storage::lastModified('file.jpg');

    File Paths

    Puteți utiliza metoda path pentru a obține calea de acces la un anumit fișier. Dacă utilizați driverul local, aceasta va returna calea absolută către fișier. Dacă utilizați driverul s3, această metodă va returna calea relativă către fișierul din bucket-ul S3:

    use Illuminate\Support\Facades\Storage;$path = Storage::path('file.jpg');

    Stocarea fișierelor

    Metoda put poate fi utilizată pentru a stoca conținutul unui fișier pe un disc. De asemenea, puteți trece un PHP resource la metoda put, care va utiliza suportul de flux subiacent al Flysystem. Nu uitați, toate căile de acces la fișiere trebuie să fie specificate în raport cu locația „rădăcină” configurată pentru disc:

    use Illuminate\Support\Facades\Storage;Storage::put('file.jpg', $contents);Storage::put('file.jpg', $resource);

    Streaming automat

    Streaming-ul fișierelor la stocare oferă o utilizare semnificativ redusă a memoriei. Dacă doriți ca Laravel să gestioneze automat streaming-ul unui anumit fișier către locația de stocare, puteți utiliza metoda putFile sau putFileAs. Această metodă acceptă fie o instanță Illuminate\Http\File, fie o instanță Illuminate\Http\UploadedFile și va transmite în mod automat fișierul către locația dorită:

    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');

    Există câteva lucruri importante de reținut despre metoda putFile. Rețineți că am specificat doar un nume de director și nu un nume de fișier. În mod implicit, metoda putFile va genera un ID unic care să servească drept nume de fișier. Extensia fișierului va fi determinată prin examinarea tipului MIME al fișierului. Calea către fișier va fi returnată de metoda putFile, astfel încât să puteți stoca calea, inclusiv numele de fișier generat, în baza de date.

    Metodele putFile și putFileAs acceptă, de asemenea, un argument pentru a specifica „vizibilitatea” fișierului stocat. Acest lucru este deosebit de util în cazul în care stocați fișierul pe un disc cloud, cum ar fi Amazon S3, și doriți ca fișierul să fie accesibil publicului prin intermediul URL-urilor generate:

    Storage::putFile('photos', new File('/path/to/photo'), 'public');

    Preluare & Anexare la fișiere

    Metodele prepend și append vă permit să scrieți la începutul sau la sfârșitul unui fișier:

    Storage::prepend('file.log', 'Prepended Text');Storage::append('file.log', 'Appended Text');

    Copierea & Mutarea fișierelor

    Metoda copy poate fi utilizată pentru a copia un fișier existent într-o nouă locație de pe disc, în timp ce metoda move poate fi utilizată pentru a redenumi sau a muta un fișier existent într-o nouă locație:

    Storage::copy('old/file.jpg', 'new/file.jpg');Storage::move('old/file.jpg', 'new/file.jpg');

    File Uploads

    În aplicațiile web, unul dintre cele mai frecvente cazuri de utilizare pentru stocarea fișierelor este stocarea fișierelor încărcate de utilizator, cum ar fi fotografii și documente. Laravel facilitează foarte mult stocarea fișierelor încărcate folosind metoda store pe o instanță de fișier încărcat. Apelați metoda store cu calea la care doriți să stocați fișierul încărcat:

    <?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; }}

    Există câteva lucruri importante de reținut în legătură cu acest exemplu. Rețineți că am specificat doar un nume de director, nu și un nume de fișier. În mod implicit, metoda store va genera un ID unic care să servească drept nume de fișier. Extensia fișierului va fi determinată prin examinarea tipului MIME al fișierului. Calea de acces la fișier va fi returnată de metoda store, astfel încât să puteți stoca calea de acces, inclusiv numele de fișier generat, în baza dumneavoastră de date.

    De asemenea, puteți apela metoda putFile de pe fațada Storage pentru a efectua aceeași operațiune de stocare a fișierelor ca în exemplul de mai sus:

    $path = Storage::putFile('avatars', $request->file('avatar'));

    Specificarea unui nume de fișier

    Dacă nu doriți ca un nume de fișier să fie atribuit automat fișierului stocat, puteți utiliza metoda storeAs, care primește ca argumente calea, numele fișierului și discul (opțional):

    $path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id);

    Puteți utiliza, de asemenea, metoda putFileAs de pe fațada Storage, care va efectua aceeași operațiune de stocare a fișierelor ca în exemplul de mai sus:

    $path = Storage::putFileAs( 'avatars', $request->file('avatar'), $request->user()->id);

    {note} Caracterele unicode neimprimabile și invalide vor fi eliminate automat din căile de acces la fișiere. Prin urmare, este posibil să doriți să vă curățați căile de fișier înainte de a le transmite metodelor de stocare a fișierelor din Laravel. Căile de acces la fișiere sunt normalizate cu ajutorul metodei League\Flysystem\Util::normalizePath.

    Specificarea unui disc

    În mod implicit, metoda store a acestui fișier încărcat va utiliza discul dumneavoastră implicit. Dacă doriți să specificați un alt disc, treceți numele discului ca al doilea argument al metodei store:

    $path = $request->file('avatar')->store( 'avatars/'.$request->user()->id, 's3');

    Dacă folosiți metoda storeAs, puteți trece numele discului ca al treilea argument al metodei:

    $path = $request->file('avatar')->storeAs( 'avatars', $request->user()->id, 's3');

    Alte informații despre fișierul încărcat

    Dacă doriți să obțineți numele original al fișierului încărcat, puteți face acest lucru folosind metoda getClientOriginalName:

    $name = $request->file('avatar')->getClientOriginalName();

    Metoda extension poate fi utilizată pentru a obține extensia fișierului încărcat:

    $extension = $request->file('avatar')->extension();

    Vizibilitatea fișierelor

    În integrarea Flysystem de la Laravel, „vizibilitatea” este o abstractizare a permisiunilor de fișiere pe mai multe platforme. Fișierele pot fi declarate fie public, fie private. Atunci când un fișier este declarat public, indicați că fișierul ar trebui să fie, în general, accesibil altora. De exemplu, atunci când utilizați driverul S3, puteți prelua URL-uri pentru fișiere public.

    Puteți seta vizibilitatea atunci când scrieți fișierul prin metoda put:

    use Illuminate\Support\Facades\Storage;Storage::put('file.jpg', $contents, 'public');

    Dacă fișierul a fost deja stocat, vizibilitatea sa poate fi recuperată și setată prin metodele getVisibility și setVisibility:

    Când interacționați cu fișiere încărcate, puteți utiliza metodele storePublicly și storePubliclyAs pentru a stoca fișierul încărcat cu vizibilitatea public:

    $path = $request->file('avatar')->storePublicly('avatars', 's3');$path = $request->file('avatar')->storePubliclyAs( 'avatars', $request->user()->id, 's3');

    Fișiere locale & Vizibilitate

    Când utilizați driverul local, vizibilitatea public se traduce prin 0755 permisiuni pentru directoare și 0644 permisiuni pentru fișiere. Puteți modifica corespondențele de permisiuni în fișierul de configurare filesystems al aplicației dumneavoastră:

    'local' => , 'dir' => , ],],

    Ștergerea fișierelor

    Metoda delete acceptă un singur nume de fișier sau o matrice de fișiere de șters:

    use Illuminate\Support\Facades\Storage;Storage::delete('file.jpg');Storage::delete();

    Dacă este necesar, puteți specifica discul de pe care trebuie șters fișierul:

    use Illuminate\Support\Facades\Storage;Storage::disk('s3')->delete('path/file.jpg');

    Directories

    Get All Files Within A Directory

    Metoda files returnează un tablou cu toate fișierele dintr-un anumit director. Dacă doriți să obțineți o listă a tuturor fișierelor dintr-un anumit director, inclusiv toate subdirectoarele, puteți utiliza metoda allFiles:

    use Illuminate\Support\Facades\Storage;$files = Storage::files($directory);$files = Storage::allFiles($directory);

    Get All Directories Within A Directory

    Metoda directories returnează o listă a tuturor directoarelor dintr-un anumit director. În plus, puteți utiliza metoda allDirectories pentru a obține o listă a tuturor directoarelor dintr-un anumit director și a tuturor subdirectoarelor sale:

    $directories = Storage::directories($directory);$directories = Storage::allDirectories($directory);

    Create A Directory

    Metoda makeDirectory va crea directorul dat, inclusiv toate subdirectoarele necesare:

    Storage::makeDirectory($directory);

    Delete A Directory

    În cele din urmă, metoda deleteDirectory poate fi utilizată pentru a elimina un director și toate fișierele sale:

    Storage::deleteDirectory($directory);

    Custom Filesystems

    Integrarea Flysystem de la Laravel oferă suport pentru mai multe „drivere” din fabrică; cu toate acestea, Flysystem nu se limitează la acestea și are adaptoare pentru multe alte sisteme de stocare. Puteți crea un driver personalizat dacă doriți să utilizați unul dintre aceste adaptoare suplimentare în aplicația dumneavoastră Laravel.

    Pentru a defini un sistem de fișiere personalizat veți avea nevoie de un adaptor Flysystem. Să adăugăm în proiectul nostru un adaptor Dropbox întreținut de comunitate:

    composer require spatie/flysystem-dropbox

    În continuare, puteți înregistra driverul în cadrul metodei boot a unuia dintre furnizorii de servicii ai aplicației dumneavoastră. Pentru a realiza acest lucru, trebuie să utilizați metoda extend a fațadei Storage:

    <?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)); }); }}

    Primul argument al metodei extend este numele driverului, iar al doilea este o închidere care primește variabilele $app și $config. Închiderea trebuie să returneze o instanță a League\Flysystem\Filesystem. Variabila $config conține valorile definite în config/filesystems.php pentru discul specificat.

    După ce ați creat și înregistrat furnizorul de servicii al extensiei, puteți utiliza driverul dropbox în fișierul de configurare config/filesystems.php.

    .

    Leave a Reply