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
@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>
<!-- ... -->
<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:
<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>
(change)est l'événement déclenché par la sélection d'un fichier$eventest 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.
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.
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!
}