Système de fichiers

Voir la vidéo
Description Sommaire

Dans ce nouveau chapitre nous allons parler de l'envoie de fichiers et on va voir comment on peut gérer la sauvegarde des fichiers qui vont être soumis par les utilisateurs.

La première étape est de permettre à l'utilisateur d'envoyer un fichier en créant un champ de type fichiers au niveau de nos formulaires et en pensant à modifier l'attribut enctype du formulaire.

<form action="" method="post" class="vstack gap-2" enctype="multipart/form-data">
    <div class="form-group">
        <label for="image">Image</label>
        <input type="file" class="form-control" id="image" name="image">
    </div>
    <!-- ... -->
</form>

Ensuite dans notre contrôleur nous allons devoir gérer le fichier qui va être soumis par l'utilisateur et on va devoir le stocker dans un dossier spécifique de notre application. Le fichier peut être récupéré comme n'importe quel autre élément provenant du formulaire.

<?php
use Illuminate\Http\UploadedFile;

class BlogController extends Controller
{

    private function create (Post $post, CreatePostRequest $request): array
    {
        $data = $request->validated();
        /** @var UploadedFile|null $image */
        $image = $request->validated('image');
        // ...
    }

Sauf que dans le cas d'un fichier on obtiendra quelque chose qui est de type UploadedFile. Sur cette classe on a différentes méthodes qui permettent de gérer le traitement du fichier envoyé. Dans notre cas nous allons utiliser la méthode store() qui permet de stocker le fichier dans un dossier spécifique (avec un nom aléatoire).

$post->image = $image->store('blog', 'public');

En second paramètre de cette méthode on va devoir indiquer le nom du disque dans lequel on souhaite sauvegarder les informations. Les disques permettent de représenter différents systèmes de stockage au sein d'une application Laravel et peuvent être configurés dans le fichier config/filesystems.php.

Le disque "public" permet de stocker les fichiers dans un dossier qui sera publiquement accessible par les utilisateurs. Par défaut, cela correspondra au chemin storage/app/public. Il faudra faire un lien symbolique pour rendre ce dossier accessible.

php artisan storage:link

En plus de cette manière de gérer les fichiers envoyés on a la possibilité d'utiliser une façade pour pouvoir effectuer différentes opérations sur les fichiers comme la suppression ou le renommage. Par exemple dans notre cas on peut vouloir supprimer l'image qui aurait précédemment été envoyée par l'utilisateur lors d'une mise à jour.

use Illuminate\Support\Facades\Storage;

if ($post->image) {
    Storage::disk('public')->delete($post->image);
}
Publié
Technologies utilisées
Auteur :
Grafikart
Partager