Bestandsopslag

  • Inleiding
  • Configuratie
    • Het lokale stuurprogramma
    • De openbare schijf
    • Bestuurprogramma-vereisten
    • Caching
  • Beschikken over schijfinstanties
  • Bestanden ophalen
    • Bestanden downloaden
    • Bestands-URL’s
    • Bestandsmetadata
  • Bestanden opslaan
    • Bestanden uploaden
    • Bestanden zichtbaar
  • Bestanden verwijderen
  • Directories
  • Aangepaste Bestandssystemen

Inleiding

Laravel biedt een krachtige bestandssysteem abstractie dankzij het prachtige Flysystem PHP pakket van Frank de Jonge. De Laravel Flysystem integratie biedt eenvoudige drivers voor het werken met lokale bestandssystemen, SFTP, en Amazon S3. Nog beter, het is verbazingwekkend eenvoudig om te schakelen tussen deze opslag opties tussen uw lokale ontwikkel machine en productie server omdat de API hetzelfde blijft voor elk systeem.

Configuratie

Laravel’s bestandssysteem configuratie bestand is te vinden op config/filesystems.php. In dit bestand kunt u alle “schijven” van uw bestandssysteem configureren. Elke schijf vertegenwoordigt een bepaald opslagstuurprogramma en opslaglocatie. Voorbeeldconfiguraties voor elk ondersteund stuurprogramma zijn opgenomen in het configuratiebestand zodat u de configuratie kunt wijzigen om uw opslagvoorkeuren en referenties weer te geven.

Het local stuurprogramma werkt met bestanden die lokaal zijn opgeslagen op de server waarop de Laravel-toepassing draait, terwijl het s3 stuurprogramma wordt gebruikt om naar Amazons S3 cloudopslagdienst te schrijven.

{tip} U mag zoveel schijven configureren als u wilt en u mag zelfs meerdere schijven hebben die hetzelfde stuurprogramma gebruiken.

Het lokale stuurprogramma

Wanneer u het local stuurprogramma gebruikt, zijn alle bestandsbewerkingen relatief ten opzichte van de root map die is gedefinieerd in uw filesystems configuratiebestand. Standaard is deze waarde ingesteld op de storage/app directory. Daarom zou de volgende methode schrijven naar storage/app/example.txt:

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

De Openbare Schijf

De public schijf die is opgenomen in het filesystems configuratiebestand van uw toepassing is bedoeld voor bestanden die publiekelijk toegankelijk zullen zijn. Standaard gebruikt de public schijf de local driver en slaat zijn bestanden op in storage/app/public.

Om deze bestanden toegankelijk te maken vanaf het web, zou u een symbolische link moeten maken van public/storage naar storage/app/public. Door deze mapconventie te gebruiken, blijven uw publiek toegankelijke bestanden in één map die gemakkelijk kan worden gedeeld tussen implementaties bij het gebruik van zero down-time implementatiesystemen zoals Envoyer.

Om de symbolische link te maken, kunt u het storage:link Artisan commando gebruiken:

php artisan storage:link

Als een bestand eenmaal is opgeslagen en de symbolische link is gemaakt, kunt u een URL naar de bestanden maken met behulp van de asset helper:

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

U kunt extra symbolische links configureren in uw filesystems configuratiebestand. Elk van de geconfigureerde links wordt gemaakt wanneer u het storage:link commando uitvoert:

'links' => ,

Voorvereisten voor de driver

Composer-pakketten

Voordat u de S3- of SFTP-drivers kunt gebruiken, moet u het juiste pakket installeren via de Composer package manager:

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

Daarnaast kunt u ervoor kiezen een cache-adapter te installeren voor betere prestaties:

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

S3 Driver Configuration

De informatie over de configuratie van het S3-stuurprogramma staat in uw config/filesystems.php configuratiebestand. Dit bestand bevat een voorbeeldconfiguratiereeks voor een S3-stuurprogramma. U bent vrij om deze array aan te passen met uw eigen S3 configuratie en credentials. Voor het gemak, deze omgevingsvariabelen komen overeen met de naamgeving conventie gebruikt door de AWS CLI.

FTP Driver Configuration

Laravel’s Flysystem integraties werken geweldig met FTP; echter, een voorbeeld configuratie is niet opgenomen met de standaard filesystems.php configuratie bestand van het framework. Als u een FTP bestandssysteem moet configureren, kunt u het configuratie voorbeeld hieronder gebruiken:

'ftp' => ,

SFTP Driver Configuration

Laravel’s Flysystem integraties werken geweldig met SFTP; er is echter geen voorbeeld configuratie meegeleverd met het standaard filesystems.php configuratie bestand van het framework. Als u een SFTP bestandssysteem moet configureren, kunt u het configuratievoorbeeld hieronder gebruiken:

'sftp' => ,

Caching

Om caching voor een bepaalde schijf aan te zetten, kunt u een cache directive toevoegen aan de configuratie-opties van de schijf. De cache optie zou een array van caching opties moeten zijn die de disk naam, de expire tijd in seconden, en de cache prefix:

's3' => ,],

Beschikbare Disk Instances

De Storage facade kan gebruikt worden om te communiceren met elk van uw geconfigureerde schijven. Bijvoorbeeld, u kunt de put methode op de facade gebruiken om een avatar op de standaardschijf op te slaan. Als u methoden op de Storage facade aanroept zonder eerst de disk methode aan te roepen, zal de methode automatisch aan de standaardschijf worden doorgegeven:

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

Als uw applicatie met meerdere schijven werkt, kunt u de disk methode op de Storage facade gebruiken om met bestanden op een bepaalde schijf te werken:

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

Bestanden ophalen

De get methode kan worden gebruikt om de inhoud van een bestand op te halen. De ruwe string-inhoud van het bestand wordt door de methode teruggegeven. Onthoud dat alle bestandspaden moeten worden opgegeven relatief aan de “root” locatie van de schijf:

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

De methode exists kan worden gebruikt om te bepalen of een bestand op de schijf bestaat:

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

De methode missing kan worden gebruikt om te bepalen of een bestand op de schijf ontbreekt:

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

Downloaden van bestanden

De methode download kan worden gebruikt om een antwoord te genereren dat de browser van de gebruiker dwingt om het bestand op het gegeven pad te downloaden. De download methode accepteert een bestandsnaam als tweede argument voor de methode, die de bestandsnaam zal bepalen die wordt gezien door de gebruiker die het bestand download. Tenslotte kunt u een array van HTTP-headers als derde argument aan de methode doorgeven:

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

Bestand URLs

U kunt de methode url gebruiken om de URL voor een gegeven bestand op te vragen. Als u het local stuurprogramma gebruikt, zal dit normaal gesproken gewoon /storage toevoegen aan het gegeven pad en een relatieve URL naar het bestand teruggeven. Als u het s3 stuurprogramma gebruikt, zal de volledig gekwalificeerde remote URL worden geretourneerd:

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

Wanneer u het local stuurprogramma gebruikt, moeten alle bestanden die publiekelijk toegankelijk moeten zijn, in de storage/app/public directory worden geplaatst. Verder moet u een symbolische link maken op public/storage die verwijst naar de storage/app/public directory.

{note} Bij gebruik van het local-stuurprogramma is de retourwaarde van url niet URL-gecodeerd. Om deze reden raden wij aan om uw bestanden altijd op te slaan met namen die geldige URL’s genereren.

Tijdelijke URL’s

Met de methode temporaryUrl kunt u tijdelijke URL’s maken naar bestanden die zijn opgeslagen met het stuurprogramma s3. Deze methode accepteert een pad en een DateTime instantie die specificeert wanneer de URL moet verlopen:

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

Als u extra S3 verzoek parameters moet specificeren, kunt u de array van verzoek parameters als derde argument aan de temporaryUrl methode meegeven:

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

URL Host Customization

Als u de host voor URL’s die worden gegenereerd met de Storage facade vooraf wilt definiëren, kunt u een url optie toevoegen aan de configuratie array van de schijf:

'public' => ,

File Metadata

Naast het lezen en schrijven van bestanden, kan Laravel ook informatie verschaffen over de bestanden zelf. Bijvoorbeeld, de size methode kan worden gebruikt om de grootte van een bestand in bytes te krijgen:

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

De lastModified methode geeft de UNIX tijdstempel van de laatste keer dat het bestand is gewijzigd:

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

Bestandspaden

U kunt de path methode gebruiken om het pad voor een bepaald bestand te krijgen. Als u de local driver gebruikt, zal dit het absolute pad naar het bestand opleveren. Als u de s3 driver gebruikt, zal deze methode het relatieve pad naar het bestand in de S3 emmer teruggeven:

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

Bestanden opslaan

De put methode kan worden gebruikt om de inhoud van een bestand op een schijf op te slaan. U kunt ook een PHP resource doorgeven aan de put methode, die de onderliggende stream-ondersteuning van Flysystem zal gebruiken. Onthoud dat alle bestandspaden moeten worden opgegeven relatief aan de “root” locatie geconfigureerd voor de schijf:

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

Automatic Streaming

Streaming van bestanden naar opslag biedt aanzienlijk minder geheugengebruik. Als u wilt dat Laravel automatisch het streamen van een bepaald bestand naar uw opslaglocatie regelt, kunt u de putFile of putFileAs methode gebruiken. Deze methode accepteert een Illuminate\Http\File of Illuminate\Http\UploadedFile instantie en zal automatisch het bestand streamen naar de gewenste locatie:

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

Er zijn een paar belangrijke dingen op te merken over de putFile methode. Merk op dat we alleen een mapnaam hebben opgegeven en geen bestandsnaam. Standaard zal de methode putFile een unieke ID genereren om als bestandsnaam te dienen. De extensie van het bestand wordt bepaald door het MIME type van het bestand te onderzoeken. Het pad naar het bestand wordt geretourneerd door de putFile methode, zodat u het pad, inclusief de gegenereerde bestandsnaam, in uw database kunt opslaan.

De putFile en putFileAs methoden accepteren ook een argument om de “zichtbaarheid” van het opgeslagen bestand te specificeren. Dit is vooral nuttig als u het bestand op een cloud-schijf zoals Amazon S3 opslaat en het bestand publiekelijk toegankelijk wilt maken via gegenereerde URL’s:

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

Prepending & Appending To Files

Met de methoden prepend en append kunt u naar het begin of het einde van een bestand schrijven:

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

Kopiëren & Verplaatsen van bestanden

De methode copy kan worden gebruikt om een bestaand bestand naar een nieuwe plaats op de schijf te kopiëren, terwijl de methode move kan worden gebruikt om een bestaand bestand een andere naam te geven of naar een nieuwe plaats te verplaatsen:

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

File Uploads

In webapplicaties is een van de meest voorkomende use-cases voor het opslaan van bestanden het opslaan van door gebruikers geüploade bestanden zoals foto’s en documenten. Laravel maakt het heel eenvoudig om geuploade bestanden op te slaan door gebruik te maken van de store methode op een geuploade bestand instantie. Roep de store methode aan met het pad waar je het geuploade bestand wilt opslaan:

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

Er zijn een paar belangrijke dingen om op te merken over dit voorbeeld. Merk op dat we alleen een mapnaam hebben opgegeven, geen bestandsnaam. Standaard zal de methode store een unieke ID genereren om als bestandsnaam te dienen. De extensie van het bestand wordt bepaald door het MIME type van het bestand te onderzoeken. Het pad naar het bestand wordt geretourneerd door de methode store, zodat u het pad, inclusief de gegenereerde bestandsnaam, in uw database kunt opslaan.

U kunt ook de putFile methode op de Storage facade aanroepen om dezelfde bestandsopslag operatie uit te voeren als het voorbeeld hierboven:

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

Specifying A File Name

Als u niet wilt dat er automatisch een bestandsnaam wordt toegekend aan uw opgeslagen bestand, kunt u de storeAs methode gebruiken, die het pad, de bestandsnaam, en de (optionele) schijf als argumenten ontvangt:

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

U kunt ook de methode putFileAs op de Storage facade gebruiken, die dezelfde bestandsopslagoperatie zal uitvoeren als het bovenstaande voorbeeld:

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

{note} Onafdrukbare en ongeldige unicode karakters worden automatisch verwijderd uit bestandspaden. Daarom is het verstandig om je bestandspaden te normaliseren voordat je ze doorgeeft aan Laravel’s bestandsopslag methoden. Bestandspaden worden genormaliseerd met de League\Flysystem\Util::normalizePath methode.

Een schijf specificeren

De standaard store methode van dit geuploade bestand zal uw standaard schijf gebruiken. Als u een andere schijf wilt opgeven, geeft u de schijfnaam op als tweede argument voor de methode store:

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

Als u de methode storeAs gebruikt, kunt u de schijfnaam opgeven als derde argument voor de methode:

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

Andere informatie over het geüploade bestand

Als u de oorspronkelijke naam van het geüploade bestand wilt weten, kunt u dat doen met de methode getClientOriginalName:

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

De methode extension kan worden gebruikt om de bestandsextensie van het geüploade bestand op te halen:

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

File Visibility

In Laravels Flysystem-integratie is “zichtbaarheid” een abstractie van bestandspermissies over meerdere platforms. Bestanden kunnen ofwel public of private worden verklaard. Wanneer een bestand public wordt verklaard, geef je aan dat het bestand in het algemeen toegankelijk moet zijn voor anderen. Wanneer u bijvoorbeeld het S3-stuurprogramma gebruikt, kunt u URL’s voor public-bestanden opvragen.

U kunt de zichtbaarheid instellen wanneer u het bestand schrijft via de put-methode:

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

Als het bestand al is opgeslagen, kan de zichtbaarheid ervan worden opgehaald en ingesteld via de getVisibility– en setVisibility-methoden:

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

Bij interactie met geüploade bestanden kunt u de storePublicly en storePubliclyAs methoden gebruiken om het geüploade bestand op te slaan met public zichtbaarheid:

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

Lokale bestanden & Zichtbaarheid

Wanneer u de local driver gebruikt, vertaalt public zichtbaarheid zich naar 0755 permissies voor mappen en 0644 permissies voor bestanden. U kunt de toewijzingen van de permissies wijzigen in het filesystems configuratiebestand van uw toepassing:

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

Verwijderen van bestanden

De delete methode accepteert een enkele bestandsnaam of een array van te verwijderen bestanden:

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

Indien nodig, kunt u de schijf specificeren waarvan het bestand moet worden verwijderd:

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

Directories

Get All Files Within A Directory

De files methode retourneert een array van alle bestanden in een gegeven directory. Als u een lijst wilt opvragen van alle bestanden in een bepaalde directory, inclusief alle submappen, kunt u de methode allFiles gebruiken:

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

Get All Directories Within A Directory

De methode directories retourneert een array van alle directories in een bepaalde directory. Bovendien kunt u de methode allDirectories gebruiken om een lijst op te vragen van alle directories binnen een gegeven directory en al zijn subdirectories:

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

Create A Directory

De methode makeDirectory zal de gegeven directory creëren, met inbegrip van alle nodige subdirectories:

Storage::makeDirectory($directory);

Delete A Directory

Ten slotte kan de deleteDirectory methode worden gebruikt om een directory en al zijn bestanden te verwijderen:

Storage::deleteDirectory($directory);

Custom Filesystems

Laravel’s Flysystem integratie biedt ondersteuning voor verscheidene “drivers” uit de doos; Flysystem is echter niet beperkt tot deze en heeft adapters voor vele andere opslagsystemen. U kunt een aangepaste driver maken als u een van deze extra adapters in uw Laravel-applicatie wilt gebruiken.

Om een aangepast bestandssysteem te definiëren, hebt u een Flysystem-adapter nodig. Laten we een door de gemeenschap onderhouden Dropbox-adapter toevoegen aan ons project:

composer require spatie/flysystem-dropbox

Volgende, kunt u de driver registreren binnen de boot methode van een van de service providers van uw applicatie. Om dit te bereiken, moet u de extend-methode van de Storage facade gebruiken:

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

Het eerste argument van de extend methode is de naam van de driver en het tweede is een closure die de $app en $config variabelen ontvangt. De closure moet een instantie van League\Flysystem\Filesystem teruggeven. De $config variabele bevat de waarden gedefinieerd in config/filesystems.php voor de gespecificeerde schijf.

Nadat u de extensie’s service provider heeft gemaakt en geregistreerd, kunt u de dropbox driver gebruiken in uw config/filesystems.php configuratie bestand.

Leave a Reply