Object Storage - Téléversement de fichiers depuis le navigateur via HTTP POST
Découvrez comment permettre aux utilisateurs de téléverser des fichiers directement depuis leur navigateur vers un bucket OVHcloud Object Storage via un formulaire HTML signé côté serveur
Objectif
Ce guide explique comment implémenter des téléversements de fichiers directement depuis le navigateur vers OVHcloud Object Storage en utilisant la méthode HTTP POST, avec génération d'une POST Policy côté serveur et authentification SigV4.
Prérequis
- Disposer d'un projet Public Cloud dans votre compte OVHcloud
- Avoir créé un utilisateur Object Storage
- Avoir installé et configuré AWS CLI
En pratique
Présentation
Les téléversements POST depuis le navigateur permettent aux applications web d'autoriser les utilisateurs finaux à téléverser des fichiers directement dans un bucket OVHcloud Object Storage, sans faire transiter les données par votre serveur applicatif. Votre backend génère une politique et une signature, l'utilisateur sélectionne un fichier, et le navigateur envoie les données directement au bucket.
Le flux de téléversement comprend les étapes suivantes :
- Votre backend génère une POST Policy (un document JSON définissant les contraintes de téléversement) et la signe avec une signature HMAC-SHA256 SigV4.
- Votre page HTML contient un formulaire intégrant la politique, la signature et les métadonnées de l'objet sous forme de champs cachés.
- L'utilisateur sélectionne un fichier et soumet le formulaire.
- Le navigateur envoie la requête POST
multipart/form-datadirectement à l'endpoint OVHcloud Object Storage. - OVHcloud valide la politique, vérifie la signature et stocke l'objet.
- Le navigateur reçoit une réponse : une redirection HTTP ou un code de statut selon la configuration du formulaire.
OVHcloud Object Storage prend en charge les formats d'URL virtual-hosted style et path style pour les téléversements POST :
Remplacez <region> par l'identifiant de région OVHcloud (par exemple : gra, rbx, sbg, bhs, de, uk).
Les objets écrits via POST sont immédiatement visibles dans le bucket (cohérence forte en lecture après écriture). La taille maximale d'objet par téléversement POST est de 5 Go.
Configurer le CORS du bucket
Les téléversements POST depuis le navigateur déclenchent toujours une requête de pré-vérification CORS (OPTIONS) avant tout envoi de données. Sans règle CORS correspondante sur le bucket, le navigateur bloque silencieusement le téléversement.
Enregistrez le JSON suivant dans un fichier nommé cors.json :
Puis appliquez-le à votre bucket :
Explications :
--bucket <nom_bucket>: remplacez par le nom de votre bucket.--cors-configuration file://cors.json: chemin vers le fichier de configuration CORS.
- Définissez
AllowedOriginsavec l'origine exacte de votre application web. L'utilisation de*est acceptée mais n'est pas recommandée en production. - Supprimez
"x-amz-version-id"deExposeHeaderssi le versioning n'est pas activé sur le bucket.
Générer la POST Policy
La POST Policy est un document JSON UTF-8 généré côté serveur. Elle définit les contraintes qu'OVHcloud valide avant d'accepter le téléversement. Le document doit être encodé en base64 avant d'être placé dans le formulaire.
Structure de la politique
Explications :
expiration: horodatage ISO 8601 obligatoire en GMT. La politique est rejetée avec un HTTP 403 une fois ce délai dépassé. Évaluée par rapport à l'heure du serveur OVHcloud.conditions: chaque champ de formulaire inclus dans la requête (saufx-amz-signature,fileetpolicylui-même) doit avoir une condition correspondante dans ce tableau.content-length-range: restreint la taille de fichier acceptée en octets (ici, 1 octet à 10 Mo).
Types de conditions
Conditions
- La variable
${filename}dans le champkeyest substituée par le nom de fichier fourni par le navigateur avant la validation de la politique. Utilisez une conditionstarts-withsur$keypour restreindre les noms de fichiers acceptés. - Les champs préfixés par
x-ignore-sont exclus de la validation de la politique et ne sont pas stockés sur l'objet. - Les valeurs Unicode doivent être échappées sous la forme
\uXXXX. Les caractères barre oblique inverse\et signe dollar$doivent également être échappés. - OVHcloud normalise tous les noms de champs de formulaire en minuscules avant la validation.
Calculer la signature SigV4
La signature est calculée côté serveur en utilisant HMAC-SHA256. L'entrée de la signature est le document de politique encodé en base64.
Étape 1 - Encoder la politique
Encodez le JSON de la politique en tant que chaîne d'octets UTF-8, puis encodez ces octets en base64. La chaîne résultante est à la fois la valeur du champ de formulaire policy et l'entrée de la signature (StringToSign).
Étape 2 - Dériver la clé de signature
Explications :
<cle_secrete>: la clé d'accès secrète de votre utilisateur Object Storage.<date>: date de signature au formatYYYYMMDD(par exemple :20260706). Doit se situer dans un intervalle de 7 jours par rapport à la date actuelle du serveur OVHcloud.<region>: identifiant de région OVHcloud (par exemple :gra,rbx,bhs). Doit correspondre à la région utilisée dansx-amz-credential.- Les entrées et sorties de HMAC-SHA256 sont des octets bruts, pas des chaînes hexadécimales, à chaque étape intermédiaire.
Étape 3 - Calculer la signature
Le résultat est une chaîne hexadécimale en minuscules. Utilisez cette valeur comme champ de formulaire x-amz-signature.
Construire le formulaire HTML de téléversement
Le formulaire de téléversement doit utiliser method="POST" et enctype="multipart/form-data". L'attribut action doit être l'URL du bucket au format virtual-hosted.
Le champ de saisie file doit être le dernier champ du formulaire. Tout champ placé après file est ignoré par OVHcloud Object Storage.
Exemple de formulaire
Champs de formulaire requis
Champs de formulaire optionnels
Les données totales du formulaire, en excluant le contenu du fichier, ne doivent pas dépasser 20 480 octets (20 Ko). Un seul fichier peut être téléversé par requête POST.
Gérer les réponses
Réponses de succès
Si success_action_redirect est défini et que le téléversement réussit, le navigateur est redirigé vers cette URL. Les paramètres de requête bucket, key et etag sont ajoutés automatiquement. success_action_redirect a la priorité sur success_action_status lorsque les deux champs sont présents.
OVHcloud n'applique aucune restriction de domaine sur la cible de success_action_redirect. Restreignez toujours ce champ côté serveur lors de la génération du formulaire pour éviter les vulnérabilités de redirection ouverte.
Réponses d'erreur
En cas d'échec, OVHcloud retourne un corps d'erreur XML compatible S3 :
Conditions d'erreur courantes :
Chiffrement côté serveur (SSE)
SSE-S3 - Clé gérée par OVHcloud
Pour demander un chiffrement côté serveur avec une clé AES-256 gérée par OVHcloud, ajoutez le champ caché suivant au formulaire :
Ajoutez la condition correspondante à la POST Policy :
Si le bucket possède une configuration SSE-S3 par défaut, le chiffrement est appliqué automatiquement sans ajouter ce champ au formulaire.
SSE-C - Clé fournie par le client
Pour chiffrer l'objet avec une clé que vous fournissez, ajoutez les trois champs suivants au formulaire. Tous les trois doivent avoir des conditions correspondantes dans la POST Policy.
- Les champs SSE-C dans la requête ont la priorité sur toute configuration SSE-S3 par défaut du bucket.
- Avec SSE-C, l'
ETagretourné est une valeur opaque générée par le serveur et ne peut pas être utilisée pour la vérification de l'intégrité du contenu.
Comportement avec le versioning
L'état du versioning du bucket cible affecte la réponse au téléversement :
Pour plus d'informations, consultez le guide « Object Storage - Premiers pas avec la gestion de versions ».
Aller plus loin
Pour une formation ou une assistance technique sur la mise en œuvre de nos solutions, contactez votre commercial ou consultez la page Professional Services pour obtenir un devis et faire analyser votre projet par nos experts.
Échangez avec notre communauté d'utilisateurs.
1 : S3 est une marque déposée appartenant à Amazon Technologies, Inc. Les services de OVHcloud ne sont pas sponsorisés, approuvés, ou affiliés de quelque manière que ce soit.