Points clés à retenir
- Acceptez une seule image de produit autorisée et limitez sa taille en octets avant le début du traitement payant.
- Créez un dérivé WebP versionné en appliquant un redimensionnement avec ajustement et en désactivant le zoom pour ne pas agrandir les petites sources.
- Conservez le compte Azure, le conteneur et la clé dans les informations d’identification de Template plutôt que dans les champs de l’Assembly ou le code du navigateur.
Les images de produits arrivent souvent sous forme de fichiers d’appareil photo surdimensionnés, alors que les pages du catalogue ont besoin d’une ressource au comportement prévisible pour la diffusion. Téléverser la source directement vers Azure laisse la gestion du format, des dimensions, des métadonnées, du comportement du cache et de l’accès pour examen à des chemins de code distincts. Un Template verrouillé en trois étapes crée un seul dérivé dont l’identité de stockage durable et l’URL temporaire d’examen jouent des rôles différents ; les paramètres du compte et du conteneur Azure définissent les limites de l’accès anonyme.
L’essentiel
- Définissez délibérément Content-Type et une valeur de Cache-Control adaptée à un examen sécurisé au lieu de vous fier aux déductions de la destination.
- Traitez une URL SAS comme un accès temporaire au porteur et enregistrez le chemin du blob, et non l’URL signée, comme identité durable.
- Avant publication, réconciliez l’exportation réussie avec le produit exact, la version exacte de la source, la version exacte du flux de travail et l’identifiant exact de l’Assembly.
Modéliser l’identité de la source, du traitement et du stockage
Une photo de produit téléversée est une entrée du flux de travail, pas un événement de publication dans le catalogue. Authentifiez la personne qui téléverse le fichier, autorisez l’accès à la fiche produit, validez le type d’image détecté et la taille en octets, et créez une opération de traitement durable avant d’accepter le résultat de l’Assembly. Conservez la source modifiable ou haute résolution selon une politique de conservation explicite plutôt que de supposer que le dérivé WebP peut la remplacer.
Associez chaque dérivé à une version du flux de travail. L’enregistrement de l’application devrait relier le produit et la version de la source à ce flux de travail, à son identifiant d’Assembly ainsi qu’au conteneur Azure et au chemin du blob obtenus. Une modification ultérieure de la qualité peut ainsi créer un nouveau dérivé sans écraser la version examinée ni perdre le lien vers sa source.
Identité de la source
Le produit, le téléversement d’origine, la somme de contrôle ou la version, et le rôle de conservation.
Identité du traitement
La version enregistrée du flux de travail et l’Assembly qui a produit le dérivé.
Identité du stockage
Le périmètre du compte Azure, le conteneur et le chemin du blob versionné.
Construire le Template d’images de produits pour Azure
Le Template accepte un seul fichier via :original, l’envoie à /image/resize et exporte uniquement le WebP obtenu via /azure/store. Le redimensionnement avec ajustement maintient l’image entière dans le cadre demandé, tandis que zoom défini sur false empêche l’agrandissement d’une petite source. Le chemin versionné contient un identifiant de produit fourni uniquement après autorisation de l’application, ainsi qu’un élément garantissant l’unicité de l’Assembly.
Définissez allow_steps_override sur false pour qu’un client de téléversement ne puisse ni remplacer la destination, ni demander une charge de travail plus importante, ni contourner le traitement. L’objet auth du Template limite le nombre et la taille totale des téléversements acceptés. Ces limites réduisent la charge de travail accidentelle, mais l’application doit toujours faire respecter l’appartenance au locataire, l’état autorisé du produit, les limites de débit et une valeur autorisée pour product_id.
{
"allow_steps_override": false,
"auth": {
"max_number_of_files": 1,
"max_size": 52428800
},
"steps": {
":original": {
"robot": "/upload/handle"
},
"product_webp": {
"use": ":original",
"robot": "/image/resize",
"width": 1600,
"height": 1600,
"resize_strategy": "fit",
"zoom": false,
"format": "webp",
"quality": 82,
"strip": true
},
"azure_review": {
"use": "product_webp",
"robot": "/azure/store",
"credentials": "azure-product-images",
"path": "catalog/web-v1/${fields.product_id}/${assembly.id}/${file.url_name}",
"content_type": "image/webp",
"cache_control": "private, no-store",
"metadata": {
"workflow": "catalog-web-v1",
"source_id": "${fields.product_id}"
},
"sas_expires_in": 900,
"sas_permissions": "r",
"result": true
}
}
}Définir les propriétés et les métadonnées du blob dans le contrat de la ressource
Un WebP versionné devrait sortir du flux de travail avec un Content-Type explicite. L’exemple utilise la politique de cache private, no-store pendant l’examen afin qu’un cache partagé ne conserve pas une réponse SAS dont la validité expire. Comme /azure/store écrit cache_control sur le blob stocké, cette valeur private, no-store persiste sur l’objet. Pour diffuser ultérieurement le même blob avec une politique de mise en cache, il faut redéfinir son Cache-Control ou produire un nouveau dérivé, plutôt que de supposer que la valeur utilisée pendant l’examen s’efface d’elle-même. Enregistrez des métadonnées stables et non sensibles, telles que le nom du flux de travail et l’identifiant de l’enregistrement source, lorsque les opérateurs doivent retracer l’origine d’un blob sans ouvrir la base de données de l’application.
Ne placez ni secrets, ni informations personnelles, ni valeur de navigateur sans limites définies dans les métadonnées ou les chemins Azure. Traitez product_id comme un identifiant d’application validé, avec des limites documentées de caractères et de longueur. /azure/store convertit les valeurs de métadonnées de type chaîne, nombre et booléen en chaînes ; les consommateurs ne devraient donc pas s’attendre à ce que les types JSON d’origine soient préservés.
Utiliser une URL SAS uniquement pour un examen de courte durée
/azure/store renvoie l’URL signée dans le champ sas_url du résultat ; le champ url ordinaire n’est pas signé. Le téléversement crée un SAS même lorsque sas_expires_in est omis, avec la durée de validité par défaut du serveur. Si sas_permissions est omis, la valeur par défaut autorise l’écriture et ne fournit pas un accès en lecture seule. Cet exemple définit explicitement sas_permissions sur r et sas_expires_in sur 900 secondes. Définissez les deux valeurs plutôt que de vous fier aux valeurs par défaut pour l’accès d’examen.
Le Robot ne configure pas l’accès anonyme. Maintenez le conteneur de destination privé et vérifiez le paramètre AllowBlobPublicAccess du compte de stockage ; l’interdiction de l’accès anonyme au niveau du compte prévaut sur les paramètres du conteneur. Toute personne qui obtient l’URL SAS peut utiliser l’accès qu’elle délègue pendant sa période de validité. Ne la consignez donc pas dans les journaux, ne l’incluez pas dans les données analytiques, ne l’envoyez pas à des clients sans rapport avec l’opération et ne l’enregistrez pas comme URL permanente de la ressource du catalogue.
Enregistrez le conteneur et le chemin du blob comme identité durable. Lorsqu’un examinateur a besoin d’un accès ultérieur, l’application devrait autoriser cette demande et émettre ou obtenir un accès conformément à son mode de diffusion actuel. Une récupération réussie via SAS prouve que l’objet est lisible avec ce jeton ; elle n’approuve pas la ressource, n’autorise pas sa publication dans le catalogue et ne remplace pas l’autorisation au niveau du produit.
Vérifier le comportement des images avant la bascule du catalogue
Le Step de redimensionnement définit strip sur true, ce qui supprime du dérivé toutes les métadonnées intégrées, y compris le profil colorimétrique ICC. Testez l’orientation EXIF, les images larges et hautes, les entrées transparentes, le comportement des profils colorimétriques, les très petites sources, les très grandes dimensions, l’animation et les données malformées. Comparez le rendu de sortie ainsi que son type MIME, ses dimensions, sa taille en octets et ses métadonnées de stockage. La suppression du profil et la conversion WebP peuvent chacune affecter les couleurs du rendu ou d’autres comportements requis.
Vérifiez que les paramètres du compte et du conteneur Azure empêchent la lecture anonyme du blob à examiner. Réconciliez l’exportation réussie avec l’opération produit attendue, puis faites évoluer la fiche du catalogue par une transition autorisée distincte. Déployez d’abord sur une petite cohorte du trafic, observez le comportement de la diffusion et du cache, et conservez le dérivé précédent jusqu’à la fermeture de la fenêtre de retour en arrière.
Reprendre après un échec sans publier de doublons
Un délai d’attente dépassé ou un webhook manqué laisse l’issue incertaine ; il ne prouve pas que le blob n’a pas été écrit. Enregistrez l’opération avant de créer l’Assembly et traitez les notifications de fin signées de manière idempotente. Si l’appelant perd la réponse, inspectez l’Assembly existante et l’enregistrement de l’application avant de lancer une autre exécution.
Classez les échecs selon qu’ils concernent la réception, le traitement des images, l’authentification Azure, l’absence de conteneur ou l’exportation. Proposez aux opérateurs des actions de reprise stables tout en protégeant les détails bruts du fournisseur. Une nouvelle exécution du flux de travail devrait créer un nouvel objet versionné et ne mettre à jour le catalogue qu’après examen ; la suppression de l’ancien blob relève d’une tâche ultérieure de gestion de la conservation.
Détails techniques à connaître
- /upload/handle doit être nommé :original, ne doit pas définir use et ne peut apparaître qu’une seule fois dans un ensemble d’Assembly Instructions.
- /image/resize avec resize_strategy défini sur fit préserve le rapport largeur/hauteur et maintient chaque côté dans les limites demandées. Définir zoom sur false empêche l’agrandissement des entrées plus petites.
- /azure/store applique content_type, content_encoding, content_language, cache_control et metadata au blob stocké. Il accepte content_disposition mais ne l’applique pas actuellement au blob.
- /azure/store renvoie un accès signé pour examen dans sas_url ; le champ url ordinaire n’est pas signé. sas_expires_in contrôle la durée de validité ; s’il est omis, la valeur par défaut du serveur s’applique. Si sas_permissions est omis, la valeur par défaut autorise l’écriture ; les valeurs explicites acceptées sont r (lecture), w (écriture) et d (suppression). Ce flux de travail accorde uniquement r pour l’examen.
- /azure/store ne possède aucun paramètre de niveau d’accès. L’accès anonyme dépend à la fois du paramètre AllowBlobPublicAccess du compte de stockage et du niveau d’accès anonyme du conteneur. L’interdiction de l’accès anonyme au niveau du compte prévaut sur le paramètre du conteneur.
- Une URL SAS accorde les permissions qu’elle délègue à toute personne qui la détient pendant la période de validité de la signature.
- Les valeurs de métadonnées Azure fournies à /azure/store peuvent être des chaînes, des nombres ou des booléens ; le Robot les convertit en chaînes.
Une approche pratique
- 1
Définissez les types d’images acceptés, la taille maximale en octets, les dimensions cibles, la qualité et la politique de conservation des sources.
- 2
Créez des informations d’identification de Template pour Azure à portée limitée et enregistrez le Template verrouillé de téléversement, redimensionnement et stockage.
- 3
Testez le conteneur réel avec des données de test couvrant l’orientation, la transparence, les profils colorimétriques et des tailles inhabituellement petites et grandes.
- 4
Réconciliez le chemin du blob, procédez à l’examen via le SAS de courte durée, puis publiez au moyen d’une transition distincte du catalogue.
Quand Transloadit est utile
Utilisez /upload/handle pour une réception contrôlée des images de produits, /image/resize pour un dérivé WebP aux dimensions limitées et /azure/store pour un blob versionné dans un conteneur à accès privé. Faites renvoyer par le Step de stockage une URL SAS de courte durée en lecture seule pour examen, mais enregistrez durablement le conteneur et le chemin du blob comme identité durable.
Périmètre architectural
Transloadit accepte l’image du produit, crée un dérivé WebP et l’écrit dans un conteneur Azure Blob Storage que l’administrateur Azure ou l’application a configuré pour un accès privé. L’application reste responsable de l’autorisation d’accès au produit, de la conservation de la source, de l’état du catalogue, de la politique de diffusion et de chaque décision de rendre le dérivé accessible ou de le remplacer.
Questions fréquentes
Le catalogue doit-il enregistrer l’URL SAS ?
Non. Une URL SAS fournit un accès temporaire au porteur. Enregistrez le conteneur Azure et le chemin du blob comme identité durable, et autorisez indépendamment toute diffusion ultérieure.
Le redimensionnement avec ajustement crée-t-il un carré exact ?
Non. Il préserve le rapport largeur/hauteur et maintient les deux côtés dans les limites demandées. Utilisez une politique explicite de recadrage ou d’ajout de marges lorsque des dimensions exactes sont requises.
Pourquoi utiliser un chemin de blob versionné ?
Cela permet à plusieurs politiques de qualité de coexister, rend le comportement du cache prévisible et facilite l’examen et le retour en arrière sans écraser une ressource connue.
Le navigateur peut-il choisir le conteneur Azure ?
Non. Conservez le compte, le conteneur et la clé dans l’ensemble verrouillé d’informations d’identification de Template. Une application de confiance ne peut fournir un identifiant de produit aux limites définies qu’après autorisation.
Une exportation réussie publie-t-elle l’image du produit ?
Non. Elle prouve que le dérivé est parvenu à Azure. La publication dans le catalogue reste une transition d’état distincte de l’export, effectuée par l’application.