Comment télécharger un fichier sur S3 à l’aide du système de fichiers Laravel
Récemment, j’ai publié un article Télécharger des fichiers sur Amazon S3 à l’aide d’AWS PHP SDK. L’un de nos lecteurs a demandé comment effectuer des opérations de téléchargement de fichiers AWS S3 avec Laravel. En ce qui concerne Laravel, nous devons suivre une voie différente par rapport à PHP. Dans cet article, nous étudions comment télécharger un fichier sur S3 à l’aide d’un système de fichiers Laravel.
Laravel Filesystem fournit différents pilotes pour fonctionner avec le système de fichiers local, Amazon S3, Rackspace, etc. Ces pilotes offrent un moyen pratique et facile de télécharger des fichiers localement ou sur le cloud.
Amazon S3 est un service populaire pour stocker des images, des fichiers et des documents. Deuxièmement, conserver vos fichiers sur le cloud permettra d’économiser beaucoup de bande passante pour votre site Web. Il économise votre espace d’hébergement et les performances du cloud sont évolutives.
Cela dit, examinons comment télécharger un fichier sur S3 à l’aide du système de fichiers Laravel.
Obtenez vos informations d’identification de sécurité AWS
Pour commencer avec S3, vous devez avoir un compte sur Amazon Web Services. Une fois que vous l’avez, assurez-vous d’activer le service S3.
Après avoir activé le service S3, obtenez vos informations d’identification de sécurité dont nous aurons besoin dans la dernière partie du didacticiel.
Configuration du pilote S3 dans Laravel
Comme dit, je vais utiliser le système de fichiers Laravel. Cela nécessite la configuration du pilote S3. Rendez-vous dans votre éditeur et ouvrez le fichier config/filesystems.php
. Dans ce fichier, vous pouvez voir le pilote défini pour S3 sous « disques ».
config/filesystems.php
<?php
return [
.....
'disks' => [
.....
's3' => [
'driver' => 's3',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
],
],
];
Dans le code ci-dessus, Laravel utilise la méthode env() pour définir les valeurs. Cela signifie que vous devez définir ces constantes dans votre .env
fichier. Vous n’avez pas besoin de définir les constantes AWS_URL et AWS_ENDPOINT car cela n’est pas nécessaire pour télécharger des fichiers sur le compartiment S3.
AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=
AWS_BUCKET=
Ajoutez la valeur à chaque constante ci-dessus. Ensuite, ouvrez le terminal dans le répertoire racine de votre projet et exécutez la commande :
composer require league/flysystem-aws-s3-v3 ~1.0
Cette commande installera la bibliothèque requise qui appelle l’API AWS et effectue les opérations cloud.
Télécharger un fichier sur S3 dans Laravel
Nous avons tous réglé avec la configuration de base. Nous pouvons maintenant passer à la partie réelle du téléchargement de fichiers. Créons un formulaire simple avec une entrée de fichier et un bouton d’envoi.
Ajoutez le code ci-dessous dans votre fichier blade.
<form action="{{ url('ROUTE_URL') }}" method="post" enctype="multipart/form-data">
<div class="form-group">
<label for="exampleInputFile">File input</label>
<input type="file" name="profile_image" id="exampleInputFile">
</div>
{{ csrf_field() }}
<button type="submit" class="btn btn-default">Submit</button>
</form>
Remplacez l’espace réservé ROUTE_URL par votre itinéraire réel.
Laravel donne une Storage
façade qui permet d’interagir avec les disques configurés. Dans notre cas, le disque est S3. Ajoutez la Storage
façade dans le contrôleur comme suit :
<?php
namespace AppHttpControllers;
use IlluminateHttpRequest;
use IlluminateSupportFacadesStorage;
...
...
Après avoir inclus une façade, vous pouvez télécharger des fichiers sur S3. Écrivez le code ci-dessous dans votre méthode qui envoie le fichier sur S3.
<?php
...
...
public function store(Request $request)
{
if($request->hasFile('profile_image')) {
//get filename with extension
$filenamewithextension = $request->file('profile_image')->getClientOriginalName();
//get filename without extension
$filename = pathinfo($filenamewithextension, PATHINFO_FILENAME);
//get file extension
$extension = $request->file('profile_image')->getClientOriginalExtension();
//filename to store
$filenametostore = $filename.'_'.time().'.'.$extension;
//Upload File to s3
Storage::disk('s3')->put($filenametostore, fopen($request->file('profile_image'), 'r+'), 'public');
//Store $filenametostore in the database
}
}
Dans le code ci-dessus, je génère un nom unique pour le fichier, puis je le télécharge sur S3. Un utilisateur doit stocker le nom de fichier dans la base de données pour une utilisation ultérieure. Lors du téléchargement d’un fichier sur S3, j’ai passé le troisième paramètre en tant que « public ». Si vous ne souhaitez pas définir le fichier comme « public », ignorez ce paramètre.
L’utilisateur peut obtenir l’URL du fichier téléchargé en utilisant le code :
$url = Storage::disk('s3')->url('YOUR_FILENAME_HERE');
Pour supprimer un fichier du compartiment S3, utilisez la méthode de suppression comme indiqué ci-dessous.
Storage::disk('s3')->delete('YOUR_FILENAME_HERE');
Il s’agit de télécharger un fichier sur S3 à l’aide du système de fichiers Laravel. J’espère que vous avez pris connaissance du système fourni par Laravel pour interagir avec Amazon S3. S’il vous plaît partager vos pensées et suggestions dans la section commentaires ci-dessous.
Articles Liés
- Un guide pour télécharger et compresser des images dans Laravel
- Comment faire une sauvegarde de l’application Laravel
- Sauvegarder l’application Laravel sur Dropbox