Aller au contenu principal

23-2 Boite de sélection de fichier

Ajoutons une boite de sélection de fichiers au formulaire d'édition de projet dans projet-edition.

Ajouter le input de type file

src/app/features/projets/pages/projet-edition.ts
@Component({
selector: 'app-projet-creer',
imports: [
ReactiveFormsModule,
RouterLink
],
template: `
<div class="row">
<div class="col-lg-6 offset-lg-3">
<h1>{{ estModeEdition ? 'Modifier le projet' : 'Créer un nouveau projet' }}</h1>

<form [formGroup]="projetForm" (ngSubmit)="soumettre()">
<div class="mb-3">
<label for="formFile" class="form-label">Sélectionnez une image</label>
<input class="form-control" type="file" id="projetImage">
</div>

<!-- ... -->
info

<input type="file"> permet de définir un champ de type fichier dans un formulaire.

Détecter (event) lorsqu'un fichier a été sélectionné

Pour détecter qu'un fichier a été choisi, on doit lier l'événement change du input à une fonction.

Par exemple:

src/app/features/projets/pages/projet-edition.ts
<div class="mb-3">
<label for="formFile" class="form-label">Sélectionnez une image</label>
<input class="form-control" type="file" id="projetImage" (change)="upload($event)">
</div>
info
  • (change) est l'événement déclenché par la sélection d'un fichier
  • $event est le détail de l'événement qui vous sera envoyé par Angular et contenant, entre autres, le fichier.

Créer la fonction upload associée à l'événement

Vous pouvez maintenant créer la fonction upload dans la composante afin de récupérer le détail de l'événement.

src/app/features/projets/pages/projet-edition.ts
async upload(event: Event) {
console.log(event);
}

Si vous tentez de sélectionner une image, observez le résultat dans la console. Vous verrez que sous le détail de l'événement, il y a une propriété target (représentant le champ input) sous laquelle vous pourrez voir le fichier sélectionné et ses propriétés!

Obtenir le détail du fichier

Pour obtenir le détail du fichier, on doit donc accéder à la propriété target de l'événement, ensuite à files qui contient la liste de fichiers et finalement à files[0], soit le premier (et seul) fichier.

src/app/features/projets/pages/projet-edition.ts
async upload(event: Event) {
const target = event.target as HTMLInputElement;
const files = target.files as FileList
const file = files[0];

// On doit maintenant l'envoyer!
}