Archiviazione di file

  • Introduzione
  • Configurazione
    • Il driver locale
    • Il disco pubblico
    • Pre-requisiti del driver
    • Caching
  • Ricerca delle istanze del disco
  • Ricerca dei file
    • Scarico dei file
    • Urls dei file
    • Metadati dei file
  • Memorizzazione dei file
    • Caricamento dei file
    • Visibilità dei file
  • Eliminazione dei file
  • Direzioni
  • Custom Filesystems

Introduzione

Laravel fornisce una potente astrazione del filesystem grazie al meraviglioso pacchetto Flysystem PHP di Frank de Jonge. L’integrazione Flysystem di Laravel fornisce semplici driver per lavorare con filesystem locali, SFTP e Amazon S3. Ancora meglio, è incredibilmente semplice passare tra queste opzioni di archiviazione tra la tua macchina di sviluppo locale e il server di produzione poiché l’API rimane la stessa per ogni sistema.

Configurazione

Il file di configurazione del filesystem di Laravel si trova a config/filesystems.php. All’interno di questo file, puoi configurare tutti i tuoi “dischi” di filesystem. Ogni disco rappresenta un particolare driver di archiviazione e una posizione di archiviazione. Configurazioni di esempio per ogni driver supportato sono incluse nel file di configurazione in modo da poter modificare la configurazione per riflettere le proprie preferenze e credenziali di archiviazione.

Il driver local interagisce con i file memorizzati localmente sul server che esegue l’applicazione Laravel mentre il driver s3 viene utilizzato per scrivere sul servizio di cloud storage S3 di Amazon.

{tip} Puoi configurare tutti i dischi che vuoi e puoi anche avere più dischi che usano lo stesso driver.

Il driver locale

Quando usi il driver local, tutte le operazioni sui file sono relative alla directory root definita nel tuo file di configurazione filesystems. Per impostazione predefinita, questo valore è impostato alla directory storage/app. Pertanto, il seguente metodo scriverebbe su storage/app/example.txt:

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

Il disco pubblico

Il disco public incluso nel file di configurazione filesystems della tua applicazione è destinato ai file che saranno accessibili pubblicamente. Per default, il disco public usa il driver local e memorizza i suoi file in storage/app/public.

Per rendere questi file accessibili dal web, dovresti creare un collegamento simbolico da public/storage a storage/app/public. Utilizzando questa convenzione di cartelle si manterranno i file accessibili pubblicamente in una directory che può essere facilmente condivisa tra le distribuzioni quando si utilizzano sistemi di distribuzione a tempo zero come Envoyer.

Per creare il link simbolico, puoi usare il comando storage:link Artisan:

php artisan storage:link

Una volta che un file è stato memorizzato e il link simbolico è stato creato, puoi creare un URL ai file usando l’helper asset:

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

Puoi configurare ulteriori link simbolici nel tuo file di configurazione filesystems. Ognuno dei link configurati verrà creato quando eseguirai il comando storage:link:

'links' => ,

Pre-requisiti del driver

Pacchetti Composer

Prima di usare i driver S3 o SFTP, dovrai installare il pacchetto appropriato tramite il gestore dei pacchetti Composer:

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

Inoltre, puoi scegliere di installare un adattatore cache per aumentare le prestazioni:

  • CachedAdapter: league/flysystem-cached-adapter ~1.0

Configurazione del driver S3

Le informazioni sulla configurazione del driver S3 si trovano nel tuo file di configurazione config/filesystems.php. Questo file contiene un array di configurazione di esempio per un driver S3. Sei libero di modificare questo array con la tua configurazione S3 e le tue credenziali. Per comodità, queste variabili d’ambiente corrispondono alla convenzione di denominazione utilizzata da AWS CLI.

Configurazione del driver FTP

Le integrazioni Flysystem di Laravel funzionano benissimo con FTP; tuttavia, una configurazione di esempio non è inclusa nel file di configurazione predefinito del framework filesystems.php. Se hai bisogno di configurare un filesystem FTP, puoi usare l’esempio di configurazione che segue:

'ftp' => ,

Configurazione del driver SFTP

Le integrazioni Flysystem di Laravel funzionano benissimo con SFTP; tuttavia, una configurazione di esempio non è inclusa nel file di configurazione predefinito filesystems.php del framework. Se hai bisogno di configurare un filesystem SFTP, puoi usare l’esempio di configurazione che segue:

'sftp' => ,

Caching

Per abilitare la cache per un dato disco, puoi aggiungere una direttiva cache alle opzioni di configurazione del disco. L’opzione cache dovrebbe essere un array di opzioni di caching contenente il nome disk, il tempo expire in secondi, e la cache prefix:

's3' => ,],

Obtaining Disk Instances

La facciata Storage può essere usata per interagire con qualsiasi disco configurato. Per esempio, puoi usare il metodo put sulla facciata per memorizzare un avatar sul disco predefinito. Se chiamate i metodi sulla facciata Storage senza prima chiamare il metodo disk, il metodo verrà automaticamente passato al disco di default:

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

Se la tua applicazione interagisce con più dischi, puoi usare il metodo disk sulla facciata Storage per lavorare con i file su un particolare disco:

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

Recupero dei file

Il metodo get può essere usato per recuperare il contenuto di un file. Il metodo restituisce il contenuto della stringa grezza del file. Ricorda, tutti i percorsi dei file dovrebbero essere specificati relativi alla posizione “root” del disco:

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

Il metodo exists può essere usato per determinare se un file esiste sul disco:

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

Il metodo missing può essere usato per determinare se un file manca dal disco:

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

Downloading Files

Il metodo download può essere usato per generare una risposta che forza il browser dell’utente a scaricare il file nel percorso dato. Il metodo download accetta un nome di file come secondo argomento del metodo, che determinerà il nome del file che viene visto dall’utente che scarica il file. Infine, puoi passare un array di intestazioni HTTP come terzo argomento al metodo:

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

Urls di file

Puoi usare il metodo url per ottenere l’URL di un dato file. Se stai usando il driver local, questo tipicamente aggiungerà solo /storage al percorso dato e restituirà un URL relativo al file. Se stai usando il driver s3, verrà restituito l’URL remoto completamente qualificato:

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

Quando usi il driver local, tutti i file che dovrebbero essere accessibili pubblicamente dovrebbero essere messi nella directory storage/app/public. Inoltre, dovresti creare un collegamento simbolico a public/storage che punti alla directory storage/app/public.

{note} Quando si usa il driver local, il valore di ritorno di url non è codificato come URL. Per questo motivo, raccomandiamo di memorizzare sempre i tuoi file usando nomi che creino URL validi.

Utilizzando il metodo temporaryUrl, puoi creare URL temporanei ai file memorizzati usando il driver s3. Questo metodo accetta un percorso e un’istanza DateTime che specifica quando l’URL dovrebbe scadere:

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

Se hai bisogno di specificare ulteriori parametri di richiesta S3, puoi passare l’array di parametri di richiesta come terzo argomento al metodo temporaryUrl:

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

Personalizzazione dell’host dell’URL

Se vuoi predefinire l’host per gli URL generati usando la facciata Storage, puoi aggiungere un’opzione url all’array di configurazione del disco:

'public' => ,

File Metadata

Oltre a leggere e scrivere file, Laravel può anche fornire informazioni sui file stessi. Per esempio, il metodo size può essere usato per ottenere la dimensione di un file in byte:

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

Il metodo lastModified restituisce il timestamp UNIX dell’ultima volta che il file è stato modificato:

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

File Paths

Puoi usare il metodo path per ottenere il percorso di un dato file. Se state usando il driver local, questo restituirà il percorso assoluto del file. Se stai usando il driver s3, questo metodo restituirà il percorso relativo al file nel bucket S3:

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

Stoccaggio dei file

Il metodo put può essere usato per memorizzare il contenuto dei file su un disco. Puoi anche passare un PHP resource al metodo put, che userà il supporto per il flusso sottostante di Flysystem. Ricorda, tutti i percorsi dei file dovrebbero essere specificati relativi alla posizione “root” configurata per il disco:

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

Automatic Streaming

Lo streaming dei file verso lo storage offre un utilizzo della memoria significativamente ridotto. Se vuoi che Laravel gestisca automaticamente lo streaming di un dato file nella tua posizione di memorizzazione, puoi usare il metodo putFile o putFileAs. Questo metodo accetta un’istanza Illuminate\Http\File o Illuminate\Http\UploadedFile e farà automaticamente lo streaming del file nella posizione desiderata:

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

Ci sono alcune cose importanti da notare sul metodo putFile. Notate che abbiamo specificato solo un nome di directory e non un nome di file. Per impostazione predefinita, il metodo putFile genererà un ID unico che servirà come nome del file. L’estensione del file sarà determinata esaminando il tipo MIME del file. Il percorso del file sarà restituito dal metodo putFile in modo da poter memorizzare il percorso, incluso il nome del file generato, nel vostro database.

I metodi putFile e putFileAs accettano anche un argomento per specificare la “visibilità” del file memorizzato. Questo è particolarmente utile se stai memorizzando il file su un disco cloud come Amazon S3 e vuoi che il file sia accessibile pubblicamente tramite gli URL generati:

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

Preparazione & Appending To Files

I metodi prepend e append ti permettono di scrivere all’inizio o alla fine di un file:

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

Copiare & Spostare file

Il metodo copy può essere usato per copiare un file esistente in una nuova posizione sul disco, mentre il metodo move può essere usato per rinominare o spostare un file esistente in una nuova posizione:

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

File Uploads

Nelle applicazioni web, uno dei casi d’uso più comuni per la memorizzazione dei file è la memorizzazione dei file caricati dall’utente come foto e documenti. Laravel rende molto facile memorizzare i file caricati usando il metodo store su un’istanza di file caricato. Chiama il metodo store con il percorso in cui desideri memorizzare il file caricato:

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

Ci sono alcune cose importanti da notare su questo esempio. Notate che abbiamo specificato solo un nome di directory, non un nome di file. Per impostazione predefinita, il metodo store genererà un ID unico che servirà come nome del file. L’estensione del file sarà determinata esaminando il tipo MIME del file. Il percorso del file sarà restituito dal metodo store in modo da poter memorizzare il percorso, incluso il nome del file generato, nel vostro database.

Puoi anche chiamare il metodo putFile sulla facciata Storage per eseguire la stessa operazione di memorizzazione dei file dell’esempio precedente:

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

Specificare un nome di file

Se non vuoi che un nome di file sia assegnato automaticamente al tuo file memorizzato, puoi usare il metodo storeAs, che riceve come argomenti il percorso, il nome del file e il disco (opzionale):

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

Puoi anche usare il metodo putFileAs sulla facciata Storage, che eseguirà la stessa operazione di memorizzazione dei file dell’esempio precedente:

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

{note} I caratteri unicode non stampabili e non validi saranno automaticamente rimossi dai percorsi dei file. Pertanto, si potrebbe desiderare di sanitizzare i percorsi dei file prima di passarli ai metodi di archiviazione dei file di Laravel. I percorsi dei file sono normalizzati usando il metodo League\Flysystem\Util::normalizePath.

Specificare un disco

Di default, il metodo store di questo file caricato userà il tuo disco predefinito. Se vuoi specificare un altro disco, passa il nome del disco come secondo argomento al metodo store:

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

Se stai usando il metodo storeAs, puoi passare il nome del disco come terzo argomento al metodo:

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

Altre informazioni sul file caricato

Se vuoi ottenere il nome originale del file caricato, puoi farlo usando il metodo getClientOriginalName:

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

Il metodo extension può essere usato per ottenere l’estensione del file caricato:

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

Visibilità del file

Nell’integrazione Flysystem di Laravel, la “visibilità” è un’astrazione dei permessi dei file su più piattaforme. I file possono essere dichiarati public o private. Quando un file è dichiarato public, stai indicando che il file dovrebbe essere generalmente accessibile agli altri. Per esempio, quando si usa il driver S3, si possono recuperare gli URL per i file public.

Puoi impostare la visibilità quando scrivi il file tramite il metodo put:

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

Se il file è già stato memorizzato, la sua visibilità può essere recuperata e impostata tramite i metodi getVisibility e setVisibility:

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

Quando si interagisce con i file caricati, si possono usare i metodi storePublicly e storePubliclyAs per memorizzare il file caricato con public visibilità:

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

File locali & Visibilità

Quando si usa il driver local, public visibilità si traduce in 0755 permessi per le directory e 0644 permessi per i file. Puoi modificare le mappature dei permessi nel file di configurazione filesystems della tua applicazione:

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

Eliminazione di file

Il metodo delete accetta un singolo nome di file o un array di file da eliminare:

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

Se necessario, potete specificare il disco da cui il file deve essere cancellato:

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

Directories

Get All Files Within A Directory

Il metodo files restituisce un array di tutti i file in una data directory. Se vuoi recuperare una lista di tutti i file all’interno di una data directory, incluse tutte le sottodirectory, puoi usare il metodo allFiles:

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

Get All Directories Within A Directory

Il metodo directories restituisce un array di tutte le directory all’interno di una data directory. Inoltre, potete usare il metodo allDirectories per ottenere una lista di tutte le directory all’interno di una data directory e di tutte le sue sottodirectory:

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

Create A Directory

Il metodo makeDirectory creerà la directory data, incluse le sottodirectory necessarie:

Storage::makeDirectory($directory);

Delete A Directory

Infine, il metodo deleteDirectory può essere usato per rimuovere una directory e tutti i suoi file:

Storage::deleteDirectory($directory);

Custom Filesystems

L’integrazione Flysystem di Laravel fornisce supporto per diversi “driver” fuori dalla scatola; tuttavia, Flysystem non è limitato a questi e ha adattatori per molti altri sistemi di archiviazione. Puoi creare un driver personalizzato se vuoi usare uno di questi adattatori aggiuntivi nella tua applicazione Laravel.

Per definire un filesystem personalizzato avrai bisogno di un adattatore Flysystem. Aggiungiamo un adattatore Dropbox mantenuto dalla comunità al nostro progetto:

composer require spatie/flysystem-dropbox

Poi, puoi registrare il driver all’interno del metodo boot di uno dei service provider della tua applicazione. Per fare questo, dovresti usare il metodo extend della facciata 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)); }); }}

Il primo argomento del metodo extend è il nome del driver e il secondo è una chiusura che riceve le variabili $app e $config. La chiusura deve restituire un’istanza di League\Flysystem\Filesystem. La variabile $config contiene i valori definiti in config/filesystems.php per il disco specificato.

Una volta che avete creato e registrato il service provider dell’estensione, potete usare il dropbox driver nel vostro file di configurazione config/filesystems.php.

Leave a Reply