Téléchargement de photos vers Amazon S3 depuis un navigateur - AWS SDK for JavaScript

Nous avons annoncé la sortie end-of-support de la AWS SDK for JavaScript v2. Nous vous recommandons de migrer vers la AWS SDK for JavaScript version 3. Pour les dates, les détails supplémentaires et les informations sur la façon de migrer, reportez-vous à l'annonce associée.

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Téléchargement de photos vers Amazon S3 depuis un navigateur

JavaScript code example that applies to browser execution

Cet exemple de code de script de navigateur illustre :

  • Comment créer une application de navigateur qui permet aux utilisateurs de créer des albums photos dans un compartiment Amazon S3 et de télécharger des photos dans les albums.

Scénario

Dans cet exemple, une simple page HTML fournit une application basée sur un navigateur pour créer des albums photos dans un compartiment Amazon S3 dans lequel vous pouvez télécharger des photos. L'application vous permet de supprimer les photos et les albums que vous ajoutez.

JavaScript dans un script de navigateur utilisant des compartiments Amazon S3 pour les albums photos.

Le script de navigateur utilise le SDK JavaScript pour interagir avec un compartiment Amazon S3. Utilisez les méthodes suivantes de la classe client Amazon S3 pour activer l'application d'album photo :

Tâches prérequises

Pour configurer et exécuter cet exemple, vous devez d'abord :

  • Dans la console Amazon S3, créez un compartiment Amazon S3 que vous utiliserez pour stocker les photos de l'album. Pour plus d'informations sur la création d'un bucket dans la console, consultez Creating a Bucket dans le guide de l'utilisateur d'Amazon Simple Storage Service. Veillez à disposer des autorisations Read (Lecture) et Write (Écriture) sur Objets. Pour plus d'informations sur la définition des autorisations de bucket, consultez la section Configuration des autorisations pour l'accès au site Web.

  • Dans la console Amazon Cognito, créez un pool d'identités Amazon Cognito à l'aide d'identités fédérées avec un accès activé pour les utilisateurs non authentifiés de la même région que le compartiment Amazon S3. Vous devez inclure l'ID du groupe d'identités dans le code afin d'obtenir les informations d'identification relatives au script du navigateur. Pour plus d'informations sur les identités fédérées Amazon Cognito, consultez les groupes d'identités Amazon Cognito (identités fédérées) dans le guide du développeur Amazon Cognito.

  • Dans la console IAM, recherchez le rôle IAM créé par Amazon Cognito pour les utilisateurs non authentifiés. Ajoutez la politique suivante pour accorder des autorisations de lecture et d'écriture à un compartiment Amazon S3. Pour plus d'informations sur la création d'un rôle IAM, consultez la section Création d'un rôle pour déléguer des autorisations à un AWS service dans le Guide de l'utilisateur IAM.

    Utilisez cette politique de rôle pour le rôle IAM créé par Amazon Cognito pour les utilisateurs non authentifiés.

    Avertissement

    Si vous activez l'accès pour des utilisateurs non authentifiés, vous accordez un accès total en écriture sur le compartiment et tous les objets du compartiment. Dans cet exemple, cette démarche liée à la sécurité est utile pour mettre l’accent sur les principaux objectifs. Cependant, dans de nombreuses situations réelles, une sécurité plus stricte, comme l'utilisation d'utilisateurs authentifiés et la propriété d'objet, est fortement recommandée.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:DeleteObject", "s3:GetObject", "s3:ListBucket", "s3:PutObject", "s3:PutObjectAcl" ], "Resource": [ "arn:aws:s3:::BUCKET_NAME", "arn:aws:s3:::BUCKET_NAME/*" ] } ] }

Configuration de CORS

Avant que le script du navigateur puisse accéder au compartiment Amazon S3, vous devez d'abord configurer sa configuration CORS comme suit.

Important

Dans la nouvelle console S3, la configuration CORS doit être de type JSON.

JSON
[ { "AllowedHeaders": [ "*" ], "AllowedMethods": [ "HEAD", "GET", "PUT", "POST", "DELETE" ], "AllowedOrigins": [ "*" ], "ExposeHeaders": [ "ETag" ] } ]
XML
<?xml version="1.0" encoding="UTF-8"?> <CORSConfiguration xmlns="http://s3.amazonaws.com/doc/2006-03-01/"> <CORSRule> <AllowedOrigin>*</AllowedOrigin> <AllowedMethod>POST</AllowedMethod> <AllowedMethod>GET</AllowedMethod> <AllowedMethod>PUT</AllowedMethod> <AllowedMethod>DELETE</AllowedMethod> <AllowedMethod>HEAD</AllowedMethod> <AllowedHeader>*</AllowedHeader> <ExposeHeader>ETag</ExposeHeader> </CORSRule> </CORSConfiguration>

La page web

Le code HTML pour l'application de chargement de photos se compose d'un élément <div> dans lequel le script de navigateur crée l'interface utilisateur de chargement. Le premier élément <script> ajoute le kit SDK au script de navigateur. Le deuxième <script>élément ajoute le JavaScript fichier externe qui contient le code du script du navigateur.

<!DOCTYPE html> <html> <head> <!-- **DO THIS**: --> <!-- Replace SDK_VERSION_NUMBER with the current SDK version number --> <script src="https://sdk.amazonaws.com/js/aws-sdk-SDK_VERSION_NUMBER.js"></script> <script src="./s3_photoExample.js"></script> <script> function getHtml(template) { return template.join('\n'); } listAlbums(); </script> </head> <body> <h1>My Photo Albums App</h1> <div id="app"></div> </body> </html>

Configuration du kit SDK

Obtenez les informations d'identification nécessaires pour configurer le SDK en appelant la CognitoIdentityCredentials méthode, en fournissant l'ID du pool d'identités Amazon Cognito. Ensuite, créez un objet de service AWS.S3.

var albumBucketName = "BUCKET_NAME"; var bucketRegion = "REGION"; var IdentityPoolId = "IDENTITY_POOL_ID"; AWS.config.update({ region: bucketRegion, credentials: new AWS.CognitoIdentityCredentials({ IdentityPoolId: IdentityPoolId, }), }); var s3 = new AWS.S3({ apiVersion: "2006-03-01", params: { Bucket: albumBucketName }, });

Dans cet exemple, presque tout le code restant est organisé en une série de fonctions qui rassemblent et présentent des informations sur les albums dans le compartiment, chargent et affichent les photos téléchargées dans les albums, et suppriment les photos et les albums. Ces fonctions sont :

  • listAlbums

  • createAlbum

  • viewAlbum

  • addPhoto

  • deleteAlbum

  • deletePhoto

Liste des albums dans le compartiment

L'application crée des albums dans le compartiment Amazon S3 sous forme d'objets dont les touches commencent par une barre oblique, indiquant que l'objet fonctionne comme un dossier. Pour répertorier tous les albums existants, la fonction listAlbums de l'application appelle la méthode listObjects de l'objet de service AWS.S3 tout en utilisant commonPrefix, afin que l'appel retourne uniquement les objets utilisés en tant qu'albums.

Le reste de la fonction prend la liste des albums du compartiment Amazon S3 et génère le code HTML nécessaire pour afficher la liste des albums sur la page Web. Cela permet également de supprimer et d'ouvrir des albums individuels.

function listAlbums() { s3.listObjects({ Delimiter: "/" }, function (err, data) { if (err) { return alert("There was an error listing your albums: " + err.message); } else { var albums = data.CommonPrefixes.map(function (commonPrefix) { var prefix = commonPrefix.Prefix; var albumName = decodeURIComponent(prefix.replace("/", "")); return getHtml([ "<li>", "<span onclick=\"deleteAlbum('" + albumName + "')\">X</span>", "<span onclick=\"viewAlbum('" + albumName + "')\">", albumName, "</span>", "</li>", ]); }); var message = albums.length ? getHtml([ "<p>Click on an album name to view it.</p>", "<p>Click on the X to delete the album.</p>", ]) : "<p>You do not have any albums. Please Create album."; var htmlTemplate = [ "<h2>Albums</h2>", message, "<ul>", getHtml(albums), "</ul>", "<button onclick=\"createAlbum(prompt('Enter Album Name:'))\">", "Create New Album", "</button>", ]; document.getElementById("app").innerHTML = getHtml(htmlTemplate); } }); }

Création d'un album dans le compartiment

Pour créer un album dans le compartiment Amazon S3, la createAlbum fonction de l'application valide d'abord le nom donné au nouvel album afin de s'assurer qu'il contient les caractères appropriés. La fonction forme ensuite une clé d'objet Amazon S3, qu'elle transmet à la headObject méthode de l'objet de service Amazon S3. Cette méthode retourne les métadonnées pour la clé spécifiée, si bien que si elle retourne des données, cela signifie qu'un objet avec cette clé existe déjà.

Si l'album n'existe pas déjà, la fonction appelle la méthode putObject de l'objet de service AWS.S3 pour créer l'album. Ensuite, elle appelle la fonction viewAlbum pour afficher le nouvel album vide.

function createAlbum(albumName) { albumName = albumName.trim(); if (!albumName) { return alert("Album names must contain at least one non-space character."); } if (albumName.indexOf("/") !== -1) { return alert("Album names cannot contain slashes."); } var albumKey = encodeURIComponent(albumName); s3.headObject({ Key: albumKey }, function (err, data) { if (!err) { return alert("Album already exists."); } if (err.code !== "NotFound") { return alert("There was an error creating your album: " + err.message); } s3.putObject({ Key: albumKey }, function (err, data) { if (err) { return alert("There was an error creating your album: " + err.message); } alert("Successfully created album."); viewAlbum(albumName); }); }); }

Affichage d'un album

Pour afficher le contenu d'un album dans le compartiment Amazon S3, la viewAlbum fonction de l'application prend un nom d'album et crée la clé Amazon S3 pour cet album. Ensuite, la fonction appelle la méthode listObjects de l'objet de service AWS.S3 pour obtenir une liste de tous les objets (photos) de l'album.

Le reste de la fonction prend la liste des objets (photos) de l'album et génère le code HTML nécessaire à l'affichage des photos dans la page web. Cela permet également de supprimer des photos individuelles et de revenir à la liste de l'album.

function viewAlbum(albumName) { var albumPhotosKey = encodeURIComponent(albumName) + "/"; s3.listObjects({ Prefix: albumPhotosKey }, function (err, data) { if (err) { return alert("There was an error viewing your album: " + err.message); } // 'this' references the AWS.Response instance that represents the response var href = this.request.httpRequest.endpoint.href; var bucketUrl = href + albumBucketName + "/"; var photos = data.Contents.map(function (photo) { var photoKey = photo.Key; var photoUrl = bucketUrl + encodeURIComponent(photoKey); return getHtml([ "<span>", "<div>", '<img style="width:128px;height:128px;" src="' + photoUrl + '"/>', "</div>", "<div>", "<span onclick=\"deletePhoto('" + albumName + "','" + photoKey + "')\">", "X", "</span>", "<span>", photoKey.replace(albumPhotosKey, ""), "</span>", "</div>", "</span>", ]); }); var message = photos.length ? "<p>Click on the X to delete the photo</p>" : "<p>You do not have any photos in this album. Please add photos.</p>"; var htmlTemplate = [ "<h2>", "Album: " + albumName, "</h2>", message, "<div>", getHtml(photos), "</div>", '<input id="photoupload" type="file" accept="image/*">', '<button id="addphoto" onclick="addPhoto(\'' + albumName + "')\">", "Add Photo", "</button>", '<button onclick="listAlbums()">', "Back To Albums", "</button>", ]; document.getElementById("app").innerHTML = getHtml(htmlTemplate); }); }

Ajout de photos à un album

Pour télécharger une photo dans un album du compartiment Amazon S3, la addPhoto fonction de l'application utilise un élément de sélection de fichiers dans la page Web pour identifier le fichier à télécharger. Ensuite, elle forme une clé pour la photo à charger à partir du nom de l'album et du nom du fichier actuels.

La fonction appelle la upload méthode de l'objet de service Amazon S3 pour télécharger la photo. Après avoir chargé la photo, la fonction affiche de nouveau l'album afin que la photo chargée apparaisse.

function addPhoto(albumName) { var files = document.getElementById("photoupload").files; if (!files.length) { return alert("Please choose a file to upload first."); } var file = files[0]; var fileName = file.name; var albumPhotosKey = encodeURIComponent(albumName) + "/"; var photoKey = albumPhotosKey + fileName; // Use S3 ManagedUpload class as it supports multipart uploads var upload = new AWS.S3.ManagedUpload({ params: { Bucket: albumBucketName, Key: photoKey, Body: file, }, }); var promise = upload.promise(); promise.then( function (data) { alert("Successfully uploaded photo."); viewAlbum(albumName); }, function (err) { return alert("There was an error uploading your photo: ", err.message); } ); }

Suppression d'une photo

Pour supprimer une photo d'un album du compartiment Amazon S3, la deletePhoto fonction de l'application appelle la deleteObject méthode de l'objet de service Amazon S3. Cela supprime la photo spécifiée par la valeur photoKey transmise à la fonction.

function deletePhoto(albumName, photoKey) { s3.deleteObject({ Key: photoKey }, function (err, data) { if (err) { return alert("There was an error deleting your photo: ", err.message); } alert("Successfully deleted photo."); viewAlbum(albumName); }); }

Suppression d'un album

Pour supprimer un album dans le compartiment Amazon S3, la deleteAlbum fonction de l'application appelle la deleteObjects méthode de l'objet de service Amazon S3.

function deleteAlbum(albumName) { var albumKey = encodeURIComponent(albumName) + "/"; s3.listObjects({ Prefix: albumKey }, function (err, data) { if (err) { return alert("There was an error deleting your album: ", err.message); } var objects = data.Contents.map(function (object) { return { Key: object.Key }; }); s3.deleteObjects( { Delete: { Objects: objects, Quiet: true }, }, function (err, data) { if (err) { return alert("There was an error deleting your album: ", err.message); } alert("Successfully deleted album."); listAlbums(); } ); }); }