Skip to content

Commit b0b1a68

Browse files
Laboratoire 21
1 parent c309765 commit b0b1a68

File tree

8 files changed

+26
-20
lines changed

8 files changed

+26
-20
lines changed
Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
1-
# Laboratoire 21 💩
1+
# Laboratoire 21
22

3-
📦 Un [projet serveur et un projet client](../../static/files/labo20.zip) vous sont fournis. N'exécutez pas tout de suite le serveur, il y aura un modèle à ajouter, une migration à créer puis à exécuter plus tard.
4-
5-
(Oui, les projets se nomment `serveur11` et `client11`... c'est parce que `11` est une nouvelle manière d'écrire `20`.)
3+
📦 Un [projet serveur et un projet client](../../static/files/labo21.zip) vous sont fournis. N'exécutez pas tout de suite le serveur, il y aura un modèle à ajouter, une migration à créer puis à exécuter plus tard.
64

75
🎨 La librairie `ImageSharp` est déjà installée sur le serveur.
86

@@ -12,24 +10,28 @@ L'objectif sera de permettre à l'utilisateur de sélectionner une image, l’en
1210

1311
### 1 - Requête et formulaire client
1412

15-
[💡](/cours/rencontre10.2#-envoyer-un-fichier-au-serveur) Modifiez l’`<input>` de type `file` et créez un `ViewChild` qui permettra d’accéder au fichier joint par l’utilisateur.
13+
[💡](/notes/rencontre11.1#-envoyer-un-fichier-au-serveur) Modifiez l’`<input>` de type `file` et exploitez `useRef` pour accéder au fichier joint par l’utilisateur.
1614

1715
Produisez un **FormData** qui contiendra l’image et envoyez le **FormData** au serveur dans une requête `POST`. (Il se peut que vous deviez modifier l’URL de la requête plus tard sachant que l'action n'existe pas encore)
1816

1917
:::warning
2018

21-
La requête sera dans le `PictureService`, mais il faut construire **FormData** dans le composant `App`. Vous pourrez envoyer le **FormData** sous forme de paramètre au service. (Le type du paramètre sera `any`)
19+
La requête sera dans le **hook** `usePictureAPI`, mais il faut construire **FormData** dans le composant `Home`. Vous pourrez envoyer le **FormData** sous forme de paramètre à `postPicture` dans le hook. (Le type du paramètre sera `any`)
2220

2321
:::
2422

2523
### 2 - Ajouter une action POST serveur
2624

27-
[💡](/cours/rencontre10.2#-sauvegarder-une-image-sur-le-serveur) Créez un Model pour les images. Il n’aura que 3 propriétés. Ce Model n’a absolument pas besoin d’exister côté client. Une fois le Model finalisé, créez une migration et mettez à jour la base de données.
25+
[💡](/notes/rencontre11.1#-sauvegarder-une-image-sur-le-serveur) Complétez la classe `Picture.cs` qui servira de modèle pour les images. Elle n’aura que 3 propriétés. Ce modèle n’a absolument pas besoin d’exister côté client. Une fois le modèle finalisé et sauvegardé, créez une migration et mettez à jour la base de données.
2826

2927
Dans le contrôleur relativement vide fourni, complétez l’action `POST` qui recevra le fichier et l’ajoutera dans la **BD** et le **File System**.
3028

3129
On veut une **version originale** de l’image et une **version de taille réduite** avec une **hauteur de 200 pixels**.
3230

31+
<center>![Dossier pour les images](../../static/img/labo21/imageFolder.png)</center>
32+
33+
Bien entendu, pour le moment on ne peut pas afficher ces images dans la page Web.
34+
3335
:::warning
3436

3537
Des dossiers existent déjà pour les images, vérifiez le répertoire du serveur.
@@ -38,7 +40,7 @@ Des dossiers existent déjà pour les images, vérifiez le répertoire du serveu
3840

3941
## 🐦 Le petit oiseau va sortir, attrapez-le
4042

41-
L’objectif pour cette étape sera d’envoyer la liste des ids de toutes les images au client Angular. On n’a pas besoin d’envoyer les `FileName` et les `MimeType`, juste les ids.
43+
L’objectif pour cette étape sera d’envoyer la liste des ids de toutes les images au projet **Next.js**. On n’a pas besoin d’envoyer les `FileName` et les `MimeType`, juste les ids.
4244

4345
### 3 - Envoyer les ids des images au client
4446

@@ -49,52 +51,56 @@ Votre return pourrait ressembler à ceci :
4951

5052
### 4 - Recevoir les ids côté client
5153

52-
Assurez-vous simplement de recevoir la **liste d’ids** dans la fonction `ngOnInit` et dans la fonction `updateDisplay`. Ça ne sera pas suffisant pour pouvoir afficher les images, mais on y est presque.
54+
Assurez-vous simplement de recevoir la **liste d’ids** grâce à `useEffect`. Ça ne sera pas suffisant pour pouvoir afficher les images, mais on y est presque.
55+
56+
<center>![Liste d'ids](../../static/img/labo21/ids.png)</center>
5357

5458
## 🖼 Sages commes des images
5559

5660
Nous allons permettre au serveur de retourner des fichiers images pour pouvoir les afficher dans le HTML.
5761

5862
### 5 - Ajouter une action GET côté serveur
5963

60-
[💡](/cours/rencontre10.2#-afficher-une-image-sur-le-client) En vous inspirant des notes de cours, retournez le fichier associé à l’id demandé.
64+
[💡](/notes/rencontre11.1#-afficher-une-image-sur-le-client) En vous inspirant des notes de cours, retournez le fichier associé à l’id demandé.
6165

6266
N’oubliez pas de permettre de choisir entre les tailles « large » et « small ».
6367

6468
### 6 - Afficher les images côté client
6569

66-
[💡](/cours/rencontre10.2#-afficher-une-image-sur-le-client) Dans le HTML, modifiez l’attribut `[src]` pour demander l’image au serveur en format small, pour chaque id d’image existante.
70+
[💡](/notes/rencontre11.1#-afficher-une-image-sur-le-client) Dans le HTML, modifiez l’attribut `src` pour demander l’image au serveur en format small, pour chaque id d’image existante. (La liste d'ids reçue par le client permet d'afficher chaque image, individuellement, à l'aide d'une requête dans le `src`.)
6771

6872
De plus, il faut que cliquer sur une image l’affiche en format large dans un autre onglet. (Utilisez un élément `<a>` et mettez la bonne requête dans son attribut `href`, ça ouvrira une page qui contiendra juste la grande image.)
6973

74+
<center>![Liste d'images](../../static/img/labo21/pictures.png)</center>
75+
7076
## 🚮 On va en prendre une autre
7177

72-
Pour cette étape, nous allons rendre fonctionnels les petits « X » côté Angular pour supprimer les images.
78+
Pour cette étape, nous allons rendre fonctionnels les petits « X » côté client pour supprimer les images.
7379

7480
### 7 - Ajouter un action DELETE côté serveur
7581

76-
[💡](/cours/rencontre10.2#-supprimer-une-image-du-serveur) Inspirez-vous de l’action Delete dans les notes de cours pour trouver l’image dans le **DbContext** et la supprimer. (N’oubliez pas de supprimer ses deux copies sur le disque également)
82+
[💡](/notes/rencontre11.1#-supprimer-une-image-du-serveur) Inspirez-vous de l’action Delete dans les notes de cours pour trouver l’image dans le **DbContext** et la supprimer. (N’oubliez pas de supprimer ses deux copies sur le disque également)
7783

78-
Simplement retourner Ok() est convenable.
84+
Simplement retourner `Ok()` est convenable.
7985

8086
### 8 - Envoyer la requête côté client
8187

82-
Il faudra lancer une requête qui fournit simplement l’id de l’image à supprimer.
88+
Il faudra lancer une requête qui fournit simplement l’id de l’image à supprimer. La requête est déjà prête, il manque seulement un événement `onClick` dans le HTML qui appelle correctement une fonction.
8389

8490
## 🍇 Un c'est bien, mais cinquante-douze c'est mieux
8591

86-
Pour cette étape, on souhaite permettre à l’utilisateur de poster plusieurs images simultanément plutôt qu’une seule à la fois. Il y aura plusieurs changements à faire pour que ce soit possible.
92+
Pour cette étape **qui vous servira beaucoup dans le TP4**, on souhaite permettre à l’utilisateur de poster plusieurs images simultanément plutôt qu’une seule à la fois. Il y aura plusieurs changements à faire pour que ce soit possible.
8793

8894
### 9 - Modifier le client
8995

90-
[💡](/cours/rencontre10.2#-envoyer-un-fichier-au-serveur) Dans l’`<input>` de type file, ajoutez l’attribut HTML `multiple` (il n’a pas de valeur), qui permet de sélectionner plusieurs fichiers à la fois.
96+
[💡](/notes/rencontre11.1#-envoyer-un-fichier-au-serveur) Dans l’`<input>` de type file, ajoutez l’attribut HTML `multiple` (il n’a pas de valeur), qui permet de sélectionner plusieurs fichiers à la fois.
9197

9298
Lorsque vous meublerez le formData, vous allez devoir `.append()` un à plusieurs fichiers maintenant. Comme chaque **clé** doit être unique, visez quelque chose comme `"image0"`, `"image1"`, `"image2"`, etc.
9399

94-
Quand il y avait un seul fichier, on allait le chercher avec `.nativeElement.Files[0]`. Pour les suivants, il suffira de remplacer le 0 par 1, puis 2, puis 3, etc. Vous devrez utiliser une boucle for ou while.
100+
Quand il y avait un seul fichier, on allait le chercher avec `.current.files[0]`. Pour les suivants, il suffira de remplacer le 0 par 1, puis 2, puis 3, etc. ou encore de parcourir `for (let f of ...current.files)`
95101

96102
### 10 - Modifier l'action POST du serveur
97103

98-
Un peu la même idée que côté Angular : comme on va recevoir un à plusieurs fichiers, il faudra mettre une boucle dans le code et faire `GetFile( … )` jusqu’à ce qu’on ait épuisé tous les fichiers.
104+
[💡](/notes/rencontre11.1#-sauvegarder-une-image-sur-le-serveur) Un peu la même idée que côté client : comme on va recevoir un à plusieurs fichiers, il faudra mettre une boucle dans le code et faire `GetFile( … )` jusqu’à ce qu’on ait épuisé tous les fichiers.
99105

100106
Assurez-vous que ça fonctionne une fois que vous avez terminé.
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
<center>![Bannière décorative](../../static/img/labo21/banner.png)</center>
44

5-
C'est le dernier laboratoire ! 😭 Téléchargez les [projets de départ](../../static/files/labo21.zip) en séchant vos larmes 💦
5+
C'est le dernier laboratoire ! 😭 Téléchargez les [projets de départ](../../static/files/labo22.zip) en séchant vos larmes 💦
66

77
## 😩 Jeu de rôles
88

web/static/files/labo20.zip

-10.2 MB
Binary file not shown.

web/static/files/labo21.zip

-62 KB
Binary file not shown.

web/static/files/labo22.zip

140 KB
Binary file not shown.

web/static/img/labo21/ids.png

6.35 KB
Loading
40.4 KB
Loading

web/static/img/labo21/pictures.png

227 KB
Loading

0 commit comments

Comments
 (0)