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 vanurl
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