Démarrer avec AWS

Créer une application React complète

Créer une application Web simple avec AWS Amplify

Module 5 : Augmenter la capacité de stockage

Dans ce module, vous apprendrez à augmenter la capacité de stockage et à associer une image avec les notes dans votre application.

Présentation

Maintenant que les notes fonctionnent dans l'application, apprenons à associer une image à chaque note. Dans ce module, vous allez utiliser la CLI Amplify et les bibliothèques pour créer un service de stockage qui exploite Amazon S3. Vous pourrez ensuite mettre à jour le schéma GraphQL que vous avez créé dans le module précédent pour associer une image à chaque note. Et pour finir, vous mettrez à jour l'application React pour autoriser le téléchargement, la récupération et le rendu d'images.

Qu'allez-vous accomplir ?

Dans ce module, vous allez :
  • Créer un service de stockage
  • Mettre à jour un schéma GraphQL
  • Mettre à jour votre application React

Concepts clés

Service de stockage : le stockage et la requête de fichiers, tels que des images et des vidéos, sont des exigences communes à la plupart des applications. L'une des solutions consiste à encoder le fichier en Base64 et à l'envoyer en tant que chaîne à sauvegarder dans la base de données. Cela présente toutefois des inconvénients, notamment le fait que le fichier codé est plus volumineux que le binaire d'origine, que l'opération est coûteuse en calculs et que le codage et le décodage sont plus complexes. Une autre option consiste à disposer d'un service de stockage spécialement conçu et optimisé pour le stockage de fichiers. Les services de stockage, comme Amazon S3, assurent ces opérations de manière facile, performante et aussi peu coûteuse que possible.

 Temps nécessaire

10 minutes

 Services utilisés

Mise en œuvre

  • Pour ajouter une fonctionnalité de stockage d'images, nous utiliserons la catégorie de stockage Amplify. Vous pouvez conserver les sélections par défaut pour la plupart des options ci-dessous, mais veillez à sélectionner les options de création/mise à jour, de lecture et de suppression individuellement en appuyant sur la barre d'espace de chacune d'elles avant d'appuyer sur Entrée pour continuer avec l'invite.

    amplify add storage
    
    ? Select from one of the below mentioned services: Content (Images, audio, video, etc.)
    ? Provide a friendly name for your resource that will be used to label this category in the project: imagestorage
    ? Provide bucket name: <your-unique-bucket-name>
    ? Who should have access: Auth users only
    ? What kind of access do you want for Authenticated users? create/update, read, delete
    ? Do you want to add a Lambda Trigger for your S3 Bucket? (y/N) no
  • Ensuite, ouvrez amplify/backend/api/notesapp/schema.graphql et mettez à jour avec le schéma suivant :

    type Note @model @auth(rules: [ { allow: public } ] ){
      id: ID!
      name: String!
      description: String
      image: String
    }

    Veillez à bien enregistrer le fichier.

  • Maintenant que le service de stockage a été configuré localement et que nous avons mis à jour le schéma GraphQL, nous pouvons déployer les mises à jour en exécutant la commande push Amplify :

    amplify push --y
  • Maintenant que le backend a été mis à jour, mettons à jour l'application React pou ajouter la fonctionnalité qui permet de télécharger et d'afficher des images dans une note. Ouvrez src/App.js et effectuez les modifications suivantes.

    a. Ajoutez d'abord la classe Storage et le composant Image à vos importations Amplify :

    import { API, Storage } from 'aws-amplify';
    import {
      Button,
      Flex,
      Heading,
      Image,
      Text,
      TextField,
      View,
      withAuthenticator,
    } from '@aws-amplify/ui-react';

    b. Mettez à jour la fonction fetchNotes qui permet de récupérer une image si une image est associée à une note :

    async function fetchNotes() {
      const apiData = await API.graphql({ query: listNotes });
      const notesFromAPI = apiData.data.listNotes.items;
      await Promise.all(
        notesFromAPI.map(async (note) => {
          if (note.image) {
            const url = await Storage.get(note.name);
            note.image = url;
          }
          return note;
        })
      );
      setNotes(notesFromAPI);
    }

    c. Mettez à jour la fonction createNote pour ajouter l'image au tableau d'images locales si une image est associée à la note :

    async function createNote(event) {
      event.preventDefault();
      const form = new FormData(event.target);
      const image = form.get("image");
      const data = {
        name: form.get("name"),
        description: form.get("description"),
        image: image.name,
      };
      if (!!data.image) await Storage.put(data.name, image);
      await API.graphql({
        query: createNoteMutation,
        variables: { input: data },
      });
      fetchNotes();
      event.target.reset();
    }
    

    d. Mettez à jour la fonction deleteNote pour supprimer des fichiers du stockage lorsque des notes sont supprimées :

    async function deleteNote({ id, name }) {
      const newNotes = notes.filter((note) => note.id !== id);
      setNotes(newNotes);
      await Storage.remove(name);
      await API.graphql({
        query: deleteNoteMutation,
        variables: { input: { id } },
      });
    }

    e. Ajoutez une entrée supplémentaire au formulaire dans le bloc de retour :

    <View
      name="image"
      as="input"
      type="file"
      style={{ alignSelf: "end" }}
    />

    f. Lors du mappage avec le tableau de notes, générez une image si elle existe :

    {notes.map((note) => (
      <Flex
        key={note.id || note.name}
        direction="row"
        justifyContent="center"
        alignItems="center"
      >
        <Text as="strong" fontWeight={700}>
          {note.name}
        </Text>
        <Text as="span">{note.description}</Text>
        {note.image && (
          <Image
            src={note.image}
            alt={`visual aid for ${notes.name}`}
            style={{ width: 400 }}
          />
        )}
        <Button variation="link" onClick={() => deleteNote(note)}>
          Delete note
        </Button>
      </Flex>
    ))}

    g. Validez vos modifications et déposez-les sur GitHub. Attendez ensuite la fin de la compilation pour voir votre application complète en ligne !

    git add .
    git commit -m "Added graphql and storage"
    git push origin main
  • Pour tester l'application, exécutez la commande Start :

    npm start

    Vous devriez désormais pouvoir charger une image pour chaque note en option.

  • Suppression de services individuels

    Pour supprimer des services individuels, vous pouvez utiliser la commande de suppression Amplify :

    amplify remove auth
    
    ? Choose the resource you would want to remove: <your-service-name>

    Exécutez ensuite la commande push Amplify :

    amplify push

    Suppression de tout le projet

    Pour supprimer le projet et les ressources associées, vous pouvez exécuter la commande de suppression Amplify :

    amplify delete

Conclusion

Vous avez déployé une application Web en utilisant AWS Amplify ! Vous avez ajouté une authentification à votre application, qui permet aux utilisateurs de s'inscrire, de se connecter et de gérer leur compte. L'application possède également une API GraphQL évolutive, configurée avec une base de données Amazon DynamoDB, qui permet aux utilisateurs de créer et de supprimer des notes. Vous avez également ajouté le stockage de fichiers en utilisant Amazon S3 de sorte que les utilisateurs puissent charger des images et les visualiser dans leur application.

Cette page vous a-t-elle été utile ?

Félicitations !

Vous avez créé une application Web dans AWS ! Prochaine grande étape : approfondissez la découverte de technologies AWS spécifiques pour faire évoluer votre application au niveau supérieur.