Laravel permette di accedere a file esistenti e salvare file attraverso un’ astrazione del file system che permette di interfacciarsi con file locali o remoti con le stesse modalità.
Ciò consente non solo di leggere e scrivere dal file system locale, FTP o AWS S3 nello stesso modo, ma anche nel caso di scegliere un’opzione diversa a seconda che si stia sviluppando o si stia eseguendo l’applicazione in produzione.
Configurazione dei disk in Laravel
Le applicazioni Laravel gestiscono l’accesso ai file tramite dei disk configurati nel file config/filesystems.php. Ogni disk ha un nome identificativo e un driver che permette di definire il tipo effettivo di file system collegato. In base al driver, poi, saranno configurabili altre opzioni. Per esempio, i disk con driver local richiedono l’impostazione della opzione root per indicare a quale effettiva directory locale corrispondono. Quelli con driver s3 richiedono l’impostazione delle varie key, secret, region e bucket per poter accedere ad AWS S3.
Tra i vari disk configurati di default, è d’interesse quello nominato public. Questo disk è pensato per ospitare quei file che devono essere resi pubblicamente accessibili dall’applicazione Laravel.
Per interagire con uno dei vari disk configurati è possibile usare la facade Storage. È possibile scegliere il disk con cui interagire tramite il metodo disk.
use Illuminate\Support\Facades\Storage; // interagisce con il disk di default Storage::put('orders/22341.pdf', $content); // seleziona il disk Storage::disk('s3')->put('backup/orders/22341.pdf', $content);
Interagire con i file in Laravel
Nell’esempio precedente abbiamo già mostrato il metodo put della facade Storage che permette di salvare un certo contenuto in un file.
Il contenuto di un file può essere recuperato tramite il metodo get. Il contenuto del file in questo caso è restituito sotto forma di stringa.
$contents = Storage::get('file.pdf'); if (Storage::disk('s3')->exists('file.jpg')) { // ... }
È possibile verificare l’esistenza o l’assenza di un file tramite il metodo exist o il metodo missing, così come copiare, spostare o eliminare file con il metodo copy, il metodo move e il metodo delete.
Upload di file da web in Laravel
È possibile utilizzare un disk per permettere di caricare un file nella nostra applicazione. Un file inviato attraverso una request può essere salvato su uno disk disponibili dell’applicazione
class PictureController extends Controller { // carica una immagine sul server public function uploadPicture(Request $request) { $path = $request // recupera della request il file indicato come "picture" ->file('picture') // lo memorizza sullo disk di default nella directory "pictures" ->store('pictures'); // usare $path del file salvato, per esempio salvarlo a db // ... } }
È importante notare che tramite il metodo store il file recuperato nella request viene salvato sul disk generando anche un ID univoco per il nome del file, mentre l’estensione del file è ricavata dal tipo MIME fornito della request. Il metodo store restituisce il path del file salvato, che può essere, quindi, salvato o utilizzato. Nel caso in cui si voglia specificare il nome del file è possibile usare il metodo storeAs.
È, ovviamente, possibile passare sia a store che a storeAs anche il disk in cui salvare, tra i vari configurati.