Points clés à retenir
- Uppy gère la sélection des fichiers et la progression du téléversement ; son plugin Transloadit relie les téléversements à la validation, au traitement et à l’export gérés vers votre propre stockage.
- Traitez la reprise des transferts, les nouvelles tentatives, l’idempotence et l’expiration comme des mécanismes de fiabilité distincts, aux comportements différents en cas d’échec.
- Conservez l’autorisation des téléversements côté serveur, validez les propriétés observées des fichiers et ne publiez que depuis un stockage permanent contrôlé.
Une API de téléversement de fichiers devrait relier les opérations suivantes : téléversement authentifié → validation → traitement → stockage appartenant au client. Ce guide implémente ce circuit pour le téléversement d’images : Uppy fournit l’interface de téléversement, Transloadit exécute le flux de travail de traitement géré et votre bucket S3 stocke l’original accepté et l’aperçu. Uppy fonctionne aussi indépendamment de Transloadit ; votre application reste responsable de l’authentification des utilisateurs et de la décision de publier une ressource lorsqu’elle est prête.
L’essentiel
- Choisissez le développement interne, l’achat ou une répartition hybride des responsabilités en testant les exigences de récupération après incident, de sécurité, de traitement et d’exploitation, sans vous limiter à une démonstration du scénario idéal.
- N’utilisez des exemples propres à un framework que si leur cycle de vie, leur autorisation côté serveur et leur comportement de récupération après incident peuvent être maintenus et testés.
Définir la tâche de téléversement avant de choisir un widget
Un téléversement en production commence avant le transfert du premier octet. L’application identifie l’utilisateur, décide quelle opération est autorisée, précise le nombre et la taille des fichiers acceptables et crée un enregistrement qui peut persister après la fermeture d’un onglet du navigateur. Le transfert n’est qu’une étape. La validation, le traitement, l’export, la notification et la réconciliation des états déterminent si le produit peut ensuite utiliser le fichier en toute sécurité.
Rédigez un contrat d’achèvement en termes fonctionnels. « La requête a renvoyé 200 » est un critère insuffisant ; « l’original et les dérivés requis sont stockés pour ce tenant, l’enregistrement de la ressource indique leurs versions et un callback répété ne change rien » est vérifiable par des tests. Consignez les défaillances après lesquelles les utilisateurs peuvent réessayer, celles qui nécessitent un nouveau téléversement et celles qui laissent un état visible par un opérateur pour permettre la récupération.
Plan de contrôle
Transporte l’identité, l’autorisation, les limites, le choix du flux de travail, les métadonnées, l’état et les références aux résultats plutôt que le contenu du fichier lui-même.
Plan de données
Transporte les octets du fichier entre l’utilisateur, l’application, le service de téléversement, la couche de traitement et la destination de stockage durable.
Transition de confiance
Marque le moment où un fichier téléversé non fiable a passé les contrôles requis pour son traitement, son stockage, sa prévisualisation ou sa diffusion publique.
Choisir l’un des quatre circuits explicites pour les octets
Avec un relais applicatif, le navigateur envoie le fichier à votre serveur, qui le transmet ou le stocke. Cette approche est facile à comprendre et donne à l’application un contrôle immédiat, mais chaque octet consomme de la bande passante entrante, de la mémoire ou de l’espace disque temporaire, du temps de connexion et de la bande passante sortante. Elle convient aux petits fichiers peu fréquents lorsque le serveur existant peut faire respecter les limites et transférer les données en flux de manière sûre, sans mettre en mémoire tampon l’intégralité des corps de requête.
« Directement vers le cloud » est ambigu : nommez donc la destination. Un navigateur peut téléverser directement vers un stockage objet avec des informations d’identification de courte durée, téléverser directement vers un service de traitement tel que Transloadit, ou demander à un service d’importer le contenu d’une URL distante existante. Le stockage direct minimise les intermédiaires lorsque la persistance est la seule tâche à accomplir. Le traitement direct maintient l’application hors du circuit des données, tandis qu’un flux de travail valide, transforme et exporte les fichiers vers un stockage dont vous êtes propriétaire.
Relais applicatif
Utile pour des charges de travail modestes et des règles simples, mais l’application est responsable de la capacité de transfert, des délais d’expiration, des fichiers temporaires et de la mise à l’échelle.
Stockage objet direct
Le mieux adapté lorsque la première copie durable est le résultat principal et que le traitement ultérieur peut être déclenché de manière fiable à partir d’un événement de stockage ou d’une file d’attente.
Service de traitement direct
Utile lorsque le téléversement et les opérations asynchrones de validation, de création de dérivés, de gestion des métadonnées ou d’export vers plusieurs destinations font partie d’une même tâche observable.
Import depuis une source distante
Transfère les octets de serveur à serveur, ce qui ménage la connexion de l’utilisateur, mais nécessite une autorisation explicite d’accès à la source et des limites de récupération.
Concevoir la reprise des transferts séparément des nouvelles tentatives
Une nouvelle tentative recommence une opération ; un transfert avec reprise poursuit un téléversement existant à partir d’une position en octets confirmée par le serveur. Avec tus, le client conserve l’URL de téléversement, demande Upload-Offset au serveur et n’envoie que les octets restants. Conservez cette URL de manière persistante en dehors de l’état transitoire du composant si la reprise doit être possible après une actualisation ou un plantage, et calculez soigneusement les empreintes des fichiers afin que le fichier local d’un utilisateur ne soit jamais associé à une autre ressource de téléversement.
La reprise des transferts ne rend ni le délai illimité ni le traitement idempotent. Une Assembly Transloadit dispose toujours de huit heures à compter de sa création pour terminer le téléversement, et la création d’une Assembly de remplacement peut entraîner une répétition du traitement si l’application ne réconcilie pas l’état associé à l’ancien identifiant. Définissez comment le client gère les pauses, les périodes hors ligne, les ressources expirées, les fichiers modifiés, les téléversements abandonnés et la perte d’une réponse d’achèvement après l’acceptation des derniers octets par le serveur.
Identité de reprise
Conservez de manière persistante l’URL de téléversement fournie par le serveur avec l’utilisateur authentifié, l’empreinte du fichier local, la longueur attendue et l’enregistrement de l’opération.
Gestion de l’expiration
Lorsque la ressource de téléversement ou l’Assembly a expiré, créez une nouvelle opération et retirez l’identifiant périmé au lieu de réessayer indéfiniment.
Réconciliation de l’état d’achèvement
Consultez l’état enregistré de manière durable après des défaillances réseau ambiguës afin que le client ne suppose pas qu’une réponse manquante signifie que des octets sont manquants.
Autoriser l’opération prévue côté serveur et se méfier des octets
Le code du navigateur peut contenir une Auth Key publique, mais il ne doit jamais contenir l’Auth Secret Transloadit ni des informations d’identification permanentes pour le stockage. Authentifiez l’utilisateur dans votre application, sélectionnez un Template enregistré côté serveur et renvoyez des paramètres signés de courte durée avec une valeur unique pour nonce. Définissez allow_steps_override sur false lorsque le navigateur n’a aucune raison légitime de remplacer des Steps, car un graphe de Steps choisi par le client pourrait sinon modifier le comportement du traitement ou de l’export.
Une signature valide prouve que la charge utile des paramètres a été autorisée ; elle ne prouve pas que les octets téléversés correspondent à un nom de fichier, à une extension, à un type MIME déclaré, à un tenant ou à une politique de modération. Limitez les corps de requête avant les opérations coûteuses, inspectez les propriétés observées des fichiers, rejetez les contenus non pris en charge, effectuez une analyse de sécurité lorsque le modèle de menace l’exige et maintenez les résultats non fiables hors du stockage public jusqu’à ce que le flux de travail atteigne un état approuvé.
Autorisation de courte durée
N’accordez l’autorisation de téléversement qu’après l’authentification dans l’application et limitez-la à une opération choisie côté serveur, pour une durée limitée.
Propriétés observées
Utilisez le type détecté, les dimensions, la durée et les autres métadonnées inspectées pour le routage, au lieu de vous fier uniquement à l’extension.
Quarantaine avant publication
Séparez la réception de la diffusion publique afin que les fichiers invalides, malveillants ou rejetés par les règles ne deviennent jamais par défaut des ressources de l’application.
Séparer le stockage durable du traitement des téléversements
Un point de terminaison de téléversement n’est pas automatiquement un système de référence. Déterminez quel bucket ou quelle base de données de ressources fait autorité pour l’original, comment les fichiers dérivés lui sont rattachés, quels identifiants subsistent après un renommage et qui supprime chaque copie. Transloadit conserve les résultats temporaires pendant au moins 24 heures, tandis que leurs URL d’accès peuvent expirer après quelques heures. Exportez les fichiers qui doivent être conservés durablement. Les URL temporaires sont réservées à la récupération à court terme, pas à l’intégration de ressources ni à leur diffusion répétée dans le produit.
Intégrez l’export à l’Assembly lorsque la réussite du flux de travail exige à la fois le traitement et la conservation durable. Un Robot d’export peut utiliser des ensembles d’informations d’identification de Template enregistrés pour écrire les résultats vers la destination choisie dans le cadre du flux de travail. Vous pouvez aussi, en premier lieu, téléverser directement vers un stockage que vous contrôlez, puis déclencher le traitement à partir d’un événement contrôlé. Cette approche permet d’obtenir rapidement une copie durable, mais ajoute de l’orchestration et un transfert supplémentaire vers le système de traitement.
Responsabilité de l’original
Précisez si l’original est conservé, pendant combien de temps, sous quelle clé de tenant et si des flux de travail ultérieurs peuvent le lire à nouveau.
Traçabilité des fichiers dérivés
Enregistrez l’identifiant de la source, la configuration du flux de travail, le rôle de la sortie, les dimensions, le format et la somme de contrôle nécessaires pour expliquer chaque résultat.
Périmètre de diffusion
Diffusez les ressources approuvées depuis un stockage permanent et une couche de diffusion délibérément choisie plutôt que depuis des URL temporaires de traitement.
Choisir entre développement et achat selon le périmètre de responsabilité
Développez le circuit de transfert lorsque les besoins sont limités et que l’équipe est prête à prendre en charge l’ensemble du cycle de vie. Un petit formulaire authentifié qui transfère de petits fichiers en continu vers un seul bucket existant ne justifie pas forcément une plateforme supplémentaire. L’estimation doit néanmoins inclure l’analyse multipart, la contre-pression, l’application des limites de taille, la possibilité de reprise ou son absence délibérée, le nettoyage, les mesures contre les abus, l’observabilité, les mises à niveau et la prise en charge des défaillances qui surviennent en dehors de la durée de vie de la requête.
Un service géré devient plus intéressant lorsque le flux de travail combine des réseaux peu fiables, des fichiers volumineux, une expérience utilisateur dans le navigateur, des sources distantes, l’inspection de médias, des transformations ou plusieurs destinations de stockage. L’achat ne vous décharge pas de la responsabilité de l’application : les vérifications des tenants, l’autorisation, les enregistrements des ressources, la conservation, la publication et la gestion des incidents restent à votre charge. Une architecture hybride est souvent la plus adaptée, avec un stockage et un état métier sous votre contrôle autour d’une couche gérée de transfert et de traitement.
Coût du développement
Comptabilisez le développement, l’infrastructure, les astreintes, la maintenance des protocoles, la revue de sécurité et l’assistance aux utilisateurs, pas seulement les frais de stockage objet.
Coût de l’achat
Modélisez les octets téléversés, les opérations de traitement, les nouvelles tentatives, les transferts de stockage, les frais minimaux, le niveau d’assistance et la croissance attendue.
Responsabilité hybride
Conservez l’identité, les règles, les métadonnées et le stockage permanent dans votre produit tout en déléguant le circuit de données spécialisé et les opérations de traitement.
Comparer les fournisseurs à l’aide de tests de défaillance plutôt qu’en comptant les fonctionnalités
Créez une grille d’évaluation à partir de la charge de travail réelle du produit. Comparez les clients web et mobiles, la prise en charge des protocoles ouverts, la taille maximale des fichiers, le comportement en cas d’opérations simultanées, la répartition géographique des points de terminaison, les imports distants, l’étendue des traitements, les destinations de stockage, l’isolation des informations d’identification, la vérification des webhooks, la conservation des états, l’assistance et les possibilités de sortie. Classez chaque fonctionnalité comme obligatoire, facultative ou sans pertinence avant de consulter les pages des fournisseurs.
Soumettez les mêmes données de test à chaque candidat sérieux. Interrompez un téléversement volumineux, rechargez la page, envoyez un événement de fin dupliqué, révoquez les informations d’identification pour le stockage, refusez un fichier après réception, dépassez une limite et simulez la perte de la réponse finale. Mesurez la reprise telle que la perçoit l’utilisateur, les octets retransmis, le délai d’obtention d’une sortie durable, les éléments de diagnostic disponibles pour l’opérateur et le nettoyage. Un sélecteur de fichiers soigné renseigne peu sur ces caractéristiques en production.
Portabilité du protocole
Un protocole ouvert permettant la reprise des transferts et des clients remplaçables réduisent les dépendances lors d’une migration, mais les schémas des flux de travail et des résultats exigent tout de même de planifier cette migration.
Éléments de diagnostic opérationnel
Exigez des identifiants de tâche stables, des états finaux, des horodatages, des erreurs exploitables, des callbacks vérifiés et une procédure de réexécution documentée.
Évaluation économique complète
Comparez les coûts de transfert, de traitement, de stockage, de diffusion, d’assistance, de développement et de reprise après défaillance pour un volume mensuel représentatif.
Mettre en œuvre un téléversement signé avec Uppy et Transloadit
L’exemple côté navigateur laisse Uppy gérer la sélection et le transfert tus, tandis que le plugin Transloadit demande les paramètres d’Assembly à votre application. Le point de terminaison du serveur doit authentifier l’utilisateur actuel avant de renvoyer l’objet provenant de calcSignature. Il devrait choisir lui-même le Template au lieu d’accepter des Steps arbitraires ou une destination de stockage fournie par l’appelant, et limiter le débit des demandes d’autorisation indépendamment du trafic de téléversement.
Avant d’utiliser cet exemple, activez « Exiger une signature valide » dans les Paramètres du Workspace, enregistrez le Template ci-dessous et renseignez son ID dans TRANSLOADIT_UPLOAD_TEMPLATE_ID côté serveur. Enregistrez l’accès AWS à votre propre bucket privé sous forme d’un ensemble d’informations d’identification de Template nommé my_s3_credentials. L’Auth Key peut parvenir au navigateur ; l’Auth Secret et les informations d’identification AWS ne doivent pas y parvenir. Le point de terminaison de signature doit renvoyer Cache-Control: no-store afin que chaque opération autorisée reçoive de nouveaux paramètres.
Installez @uppy/core, @uppy/dashboard et @uppy/transloadit côté client, ainsi que le SDK @transloadit/node sur le serveur. Montez l’exemple côté navigateur lorsqu’un élément tel que <div id="photo-upload"></div> existe déjà. Implémentez /api/transloadit-params dans votre framework avec une authentification par session et une autorisation de téléversement avant d’appeler la fonction utilitaire de signature. Rejetez les requêtes non authentifiées ou non autorisées ; la fonction utilitaire elle-même n’est pas un point de terminaison d’authentification.
La politique de fichiers de l’exemple autorise une seule image JPEG, PNG ou WebP d’au plus 9 MiB. Le paramètre maxFileSize d’Uppy fournit un retour immédiat sur la taille du fichier en octets, et le filtre côté serveur du Template verrouillé impose cette limite de 9 MiB par fichier. Le paramètre signé auth.max_size fixe un budget global de requêtes de 10 MiB, comprenant les octets de la requête initiale d’Assembly et les téléversements avec possibilité de reprise ; auth.max_number_of_files limite l’Assembly à un seul fichier. Cela laisse, à titre d’exemple, une marge de 1 MiB pour les données supplémentaires des requêtes. Leur volume varie, de sorte qu’un rejet par le serveur reste la décision faisant autorité ; l’acceptation par le navigateur ne garantit pas la création de l’Assembly. waitForEncoding: true attend la fin de l’Assembly, export compris, au lieu de considérer la fin du transfert comme la fin du flux de travail.
import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import Transloadit from '@uppy/transloadit'
import '@uppy/core/css/style.min.css'
import '@uppy/dashboard/css/style.min.css'
// Mount this once after <div id="photo-upload"></div> exists in your page.
const uppy = new Uppy({
restrictions: {
maxNumberOfFiles: 1,
maxFileSize: 9 * 1024 * 1024,
allowedFileTypes: ['image/jpeg', 'image/png', 'image/webp'],
},
}).use(Dashboard, { inline: true, target: '#photo-upload' }).use(Transloadit, {
async assemblyOptions() {
const response = await fetch('/api/transloadit-params', {
credentials: 'same-origin',
cache: 'no-store',
})
if (!response.ok) {
throw new Error('Could not authorize this upload')
}
return response.json()
},
waitForEncoding: true,
retryDelays: [0, 1000, 3000, 5000, 10000],
})
uppy.on('transloadit:assembly-created', (assembly) => {
// Associate this ID with the server-side operation before the user leaves the page.
console.log('Assembly started:', assembly.assembly_id)
})
uppy.on('transloadit:complete', (assembly) => {
// Record completion against the ID persisted at transloadit:assembly-created.
console.log('Processing completed. Assembly:', assembly.assembly_id)
})
uppy.on('transloadit:assembly-error', () => {
// Show this through the application’s accessible status UI, not raw API errors or URLs.
console.error('Processing failed. Check the Assembly in your workspace.')
})
uppy.on('upload-error', () => {
// Transloadit API signature rejections and Assembly errors also reach this event.
// Failures thrown by assemblyOptions() use Uppy’s general error event instead.
// Deduplicate application notices.
console.error('The upload workflow failed. Check its status before retrying.')
})import { randomUUID } from 'node:crypto'
import { Transloadit } from '@transloadit/node'
function requiredEnvironmentValue(name: string): string {
const value = process.env[name]
if (value == null) throw new Error(`Missing environment variable: ${name}`)
return value
}
const transloadit = new Transloadit({
authKey: requiredEnvironmentValue('TRANSLOADIT_KEY'),
authSecret: requiredEnvironmentValue('TRANSLOADIT_SECRET'),
})
export function createAuthorizedUploadParameters(): { params: string; signature: string } {
// Call this only after the server has authenticated the request and authorized the operation.
const params = {
auth: {
expires: new Date(Date.now() + 5 * 60 * 1000).toISOString(),
max_size: 10 * 1024 * 1024,
max_number_of_files: 1,
},
nonce: randomUUID(),
template_id: requiredEnvironmentValue('TRANSLOADIT_UPLOAD_TEMPLATE_ID'),
}
return transloadit.calcSignature(params)
}Relier la réception, la validation, le traitement et l’export
Une seule Assembly relie le parcours complet : téléversement authentifié avec Uppy → validation avec /file/filter → traitement avec /image/resize → export avec /s3/store vers un bucket appartenant au client. Son Template enregistré fournit le flux de travail, et chaque dépendance use détermine quels fichiers atteignent le Step suivant. Uppy fournit l’expérience de téléversement ; Transloadit exécute le flux de travail géré, et non votre serveur d’application.
Le filtre vérifie le type MIME détecté et rejette les fichiers de plus de 9 MiB, puis transmet uniquement les images acceptées aux Steps d’aperçu et d’export. error_on_decline: true transforme un rejet en erreur d’Assembly. Les vérifications du type MIME et de la taille ne constituent ni une analyse antimalware ni une modération de contenu ; ajoutez ces Steps avant le traitement et l’export lorsque votre politique l’exige.
Utilisez un bucket S3 privé avec Block Public Access activé et des ensembles d’informations d’identification de Template aux autorisations correctement délimitées. acl: "bucket-default" omet l’ACL de l’objet et s’appuie sur la politique d’accès du bucket ; ce réglage ne rend pas privé un bucket public. L’export stocke l’original accepté et un aperçu limité à 1600 × 1600 pixels dans des chemins propres à l’Assembly et au fichier. Aucun des deux exports ne lit directement les données non filtrées de :original.
{
"allow_steps_override": false,
"steps": {
":original": {
"robot": "/upload/handle"
},
"accepted_images": {
"use": ":original",
"robot": "/file/filter",
"accepts": [
["${file.mime}", "regex", "^image/(jpeg|png|webp)$"]
],
"declines": [["${file.size}", ">", 9437184]],
"error_on_decline": true
},
"preview": {
"use": "accepted_images",
"robot": "/image/resize",
"resize_strategy": "fit",
"width": 1600,
"height": 1600
},
"exported": {
"use": ["accepted_images", "preview"],
"robot": "/s3/store",
"credentials": "my_s3_credentials",
"acl": "bucket-default",
"path": "uploads/${assembly.id}/${file.id}/${file.url_name}"
}
}
}Enregistrer l’opération
Enregistrez l’identifiant d’Assembly lorsque transloadit:assembly-created est déclenché, et pas seulement dans le callback de fin. Associez-le à l’utilisateur authentifié et à l’enregistrement du téléversement sur votre serveur ; ne considérez pas un identifiant fourni par le navigateur comme une preuve de propriété.
Confirmer l’achèvement et la persistance des résultats
Synchronisez l’état sur votre serveur ou vérifiez la signature d’une Assembly Notification. Exigez ASSEMBLY_COMPLETED et les résultats attendus à la fois dans results.accepted_images et dans results.preview avant de marquer le fichier comme prêt. Stockez leurs références d’objets permanentes, et non les URL temporaires de traitement ; l’URL d’un objet privé nécessite toujours une autorisation d’accès pour sa diffusion.
Gérer un échec partiel
Ne publiez pas les opérations ayant échoué et veillez à ce que les notifications de fin répétées restent sans conséquence. L’original peut être exporté avant la fin de la création de l’aperçu ; une erreur d’Assembly ne signifie donc pas que le bucket est vide. Synchronisez l’état des objets partiels ou supprimez-les avant de réessayer.
Tester une vidéo volumineuse du téléversement interrompu à l’export privé
Pour un flux de travail vidéo, créez un ensemble d’informations d’identification de Template nommé large-upload-output à l’aide d’informations d’identification IAM dont l’autorisation s3:PutObject est limitée au préfixe privé upload-tests/. Suivez la configuration IAM de /s3/store (English) pour les autorisations s3:ListBucket et s3:GetBucketLocation au niveau du bucket ; la recherche de l’emplacement est inutile lorsque l’ensemble d’informations d’identification de Template fournit bucket_region. Remplacez YOUR_AUTH_KEY par l’Auth Key du Workspace (et non son Auth Secret), enregistrez le Template ci-dessous et exigez Signature Authentication sur ce Template. Utilisez un bucket privé avec Block Public Access activé et Object Ownership défini sur Bucket owner enforced. Le réglage acl: "bucket-default" omet l’ACL de l’objet ; l’accès reste contrôlé par les politiques de votre bucket et vos politiques IAM. Pour le test, définissez TRANSLOADIT_UPLOAD_TEMPLATE_ID du point de terminaison de signature authentifié sur l’identifiant de ce Template vidéo enregistré. Réutilisez l’intégration Uppy ci-dessus avec un fichier sélectionné par l’utilisateur et une seule instance Uppy. Cette politique illustrative autorise une seule vidéo contenant jusqu’à 254 MiB de données de fichier, dans la limite globale de 256 MiB fixée par le Template pour l’ensemble des requêtes de l’Assembly. auth.max_size inclut les octets de la requête initiale de l’Assembly ainsi que tous les octets des téléversements avec reprise. Le filtre de confiance du Template rejette les fichiers de plus de 254 MiB, laissant une marge illustrative de 2 MiB pour les données supplémentaires de la requête. Pour ce test vidéo, remplacez la restriction aux seules images par allowedFileTypes: ["video/*"], définissez maxFileSize: 254 * 1024 * 1024 dans restrictions du cœur d’Uppy et définissez la valeur signée de auth.max_size sur 256 * 1024 * 1024 ; conservez les deux limites du nombre de fichiers à 1 (maxNumberOfFiles et auth.max_number_of_files). Le volume des données supplémentaires de la requête varie : le rejet côté serveur fait donc autorité ; l’acceptation par le navigateur ne garantit pas la création d’une Assembly. Vérifiez les limites de téléversement de votre Workspace et les formats source pris en charge avant le test. Le Template détecte une famille MIME vidéo, crée une variante MP4 aux dimensions limitées et exporte cette variante ainsi que l’original accepté. Il ne s’agit pas d’une politique complète de protection contre les logiciels malveillants ou les contenus dangereux.
La fin du transfert ne marque pas la fin de l’opération. Avec waitForEncoding: true, le navigateur attend le traitement, mais votre application a toujours besoin d’un identifiant d’Assembly conservé durablement et de notifications vérifiées ou d’une consultation de l’Assembly Status si l’onglet disparaît. Un échec d’export ne doit pas entraîner le marquage du fichier comme prêt. Confirmez ASSEMBLY_COMPLETED, la variante requise et les deux objets S3 privés ; comparez la somme de contrôle de l’original exporté à celle du fichier d’entrée avant d’enregistrer la réussite. Ces objets privés ne constituent pas automatiquement des URL de lecture publiques.
Effectuez trois essais témoins en ligne et trois essais avec interruption en utilisant la même vidéo de 100–200 MiB dont vous êtes propriétaire. Consignez la taille exacte du fichier en octets et son empreinte SHA-256, sa durée et ses codecs, les versions du navigateur et des paquets, le Template, la région, la formule et la configuration réseau. Dans Chrome DevTools, appliquez un profil personnalisé de limitation du débit et consignez ses paramètres, passez sur Offline lorsque le téléversement approche de 25 %, pour une durée de 10 secondes, puis rétablissez le profil sans recharger la page. Pour les défaillances réseau signalées lorsque le navigateur est hors ligne et qu’il reste des tentatives, le plugin tus d’Uppy installé suspend sa file d’attente jusqu’à un événement online. Chaque nouvelle tentative est tout de même décomptée ; la progression du téléversement peut réinitialiser le compteur. La somme de retryDelays n’est pas une durée limite hors ligne. Vérifiez qu’une requête HEAD indique la valeur Upload-Offset enregistrée et que les requêtes PATCH suivantes poursuivent le transfert sur la même ressource tus. Ce test simule une interruption dans le navigateur, et non un basculement du serveur ou toutes les conditions réseau.
Mesurez le temps écoulé entre le début du téléversement et la première Assembly terminée dont les objets exportés ont été vérifiés, et pas seulement jusqu’au dernier octet téléversé. Consignez aussi le temps entre la reconnexion et la fin du traitement, les octets retransmis lorsque cette mesure est observable, les échecs, les Assemblies dupliquées et le nombre brut d’exécutions. Il s’agit d’une procédure de test reproductible, pas d’un résultat de benchmark publié. Des échecs de requêtes répétés peuvent épuiser le nombre limité de nouvelles tentatives, le délai de huit heures pour le téléversement d’une Assembly (English) reste applicable, et cet exemple en mémoire ne restaure pas l’état après un rechargement ou la fermeture de l’onglet. Testez séparément l’annulation, l’expiration de l’autorisation, les fichiers dépassant les limites et les informations d’identification révoquées pour l’exportation. Consultez l’API de téléversement avec reprise pour le passage de relais au protocole et la démo vidéo et S3 (English) pour un exemple de traitement et d’exportation publique.
{
"allow_steps_override": false,
"auth": {
"key": "YOUR_AUTH_KEY",
"max_size": 268435456,
"max_number_of_files": 1
},
"steps": {
":original": { "robot": "/upload/handle" },
"accepted_video": {
"use": ":original",
"robot": "/file/filter",
"accepts": [["${file.mime}", "regex", "^video/"]],
"declines": [["${file.size}", ">", 266338304]],
"error_on_decline": true
},
"rendition": {
"use": "accepted_video",
"robot": "/video/encode",
"ffmpeg_stack": "v7",
"preset": "web/mp4/360p",
"width": 640,
"height": 360,
"resize_strategy": "fit",
"result": true
},
"exported": {
"use": ["accepted_video", "rendition"],
"robot": "/s3/store",
"credentials": "large-upload-output",
"acl": "bucket-default",
"path": "upload-tests/${assembly.id}/${file.id}/${file.url_name}"
}
}
}Détails techniques à connaître
- Un téléversement du navigateur vers l’application fait passer les données par le serveur applicatif, tandis qu’une architecture de téléversement direct vers le stockage ou le traitement évite de faire transiter les octets des fichiers par ce gestionnaire de requêtes.
- Le protocole de base tus reprend le transfert en lisant la valeur
Upload-Offsetdu serveur avecHEAD, puis en poursuivant avecPATCH; renvoyer le fichier entier constitue une nouvelle tentative, pas une reprise. - Le plugin Transloadit d’Uppy utilise tus pour le transfert de fichiers et peut demander des paramètres d’Assembly signés au backend d’une application via sa fonction
assemblyOptions. - Signature Authentication de Transloadit signe les paramètres encodés en JSON avec l’Auth Secret sur un serveur de confiance ; le secret lui-même ne doit jamais être envoyé au code du navigateur.
- Un Template enregistré dont
allow_steps_overrideest défini sur false empêche un client non fiable de remplacer ses Steps ou de sélectionner une autre destination de stockage en redéfinissant des Steps. - Exportez les fichiers qui doivent être conservés : les résultats temporaires sont conservés pendant au moins 24 heures, mais leurs URL peuvent expirer après quelques heures et sont destinées uniquement à une récupération limitée, à court terme.
- Pour les téléversements tus de Transloadit, l’Assembly est créée avant l’arrivée des octets des fichiers et reste dans l’état
ASSEMBLY_UPLOADINGjusqu’à la fin des téléversements déclarés. - Le délai de téléversement de Transloadit est de huit heures à compter de la création de l’Assembly ; un client permettant la reprise doit donc tout de même prévoir explicitement un mécanisme de redémarrage lorsque l’Assembly a expiré.
Une approche pratique
- 1
Documentez le trajet des octets, les transitions entre niveaux de confiance, le responsable de leur conservation durable et le contrat d’achèvement avant de choisir un outil de téléversement.
- 2
Testez les options de relais, de transfert direct vers le stockage et de transfert direct vers le service de traitement avec des fichiers représentatifs et des défaillances réseau.
- 3
Mettez en place une autorisation de courte durée côté serveur, la reprise des transferts, la validation, l’export et un traitement idempotent des résultats.
- 4
Testez en charge le circuit choisi et simulez l’expiration, les callbacks répétés, la révocation des informations d’identification et les défaillances partielles.
Quand Transloadit est utile
Utilisez Transloadit lorsque les téléversements nécessitent un flux de travail géré reliant le transfert avec prise en charge de la reprise, la validation côté serveur, le traitement et les exports vers un stockage que vous contrôlez. Les contrats exacts des paramètres figurent dans la documentation des Robots /upload/handle, /file/filter, /image/resize, /video/encode et /s3/store.
Périmètre architectural
Transloadit peut recevoir des fichiers, exécuter des flux de travail de traitement asynchrones et exporter des résultats, mais votre application reste responsable de l’authentification des utilisateurs, des autorisations des tenants, de l’enregistrement durable de la ressource, de la politique de publication et de la diffusion depuis le stockage permanent.
Questions fréquentes
Que signifie « téléversement direct vers le cloud » ?
Ce terme ne désigne pas une architecture unique. Il peut s’agir d’un transfert du navigateur vers un stockage objet, du navigateur vers un service de traitement, ou d’un import de serveur à serveur depuis un autre fournisseur. Précisez la destination réelle des octets, le mécanisme d’autorisation, le responsable de leur conservation durable et le déclencheur du traitement avant de comparer les implémentations.
Les fichiers doivent-ils passer par mon serveur applicatif ?
Seulement si les avantages en matière de politique ou de simplicité l’emportent sur la charge liée à la gestion du trajet des données. Le relais peut convenir aux téléversements de petits fichiers peu fréquents, mais le transfert direct vers le stockage ou le service de traitement évite de mobiliser la bande passante de l’application, le temps de requête, l’espace disque temporaire et la capacité de connexion pour chaque octet.
Une nouvelle tentative équivaut-elle à un téléversement avec prise en charge de la reprise ?
Non. Une nouvelle tentative recommence normalement le transfert, tandis que la reprise poursuit le transfert d’une ressource existante à partir de la position en octets confirmée par le serveur. Le client doit conserver l’identité du téléversement et gérer aussi l’expiration, les modifications des fichiers locaux et les réponses finales ambiguës.
Transloadit stocke-t-il les fichiers téléversés de façon permanente ?
Utilisez un Robot d’export pour les fichiers qui doivent être conservés durablement. Les résultats temporaires du traitement sont conservés pendant au moins 24 heures, tandis que leurs URL peuvent expirer après quelques heures. Les flux de travail en production devraient exporter les résultats vers un stockage contrôlé ou n’utiliser les URL temporaires que pour une récupération limitée et à court terme dans votre propre infrastructure.
Quand devrais-je développer une API de téléversement plutôt que l’acheter ?
Un développement interne peut être judicieux pour un circuit limité, avec de petits fichiers, une seule destination de stockage, des réseaux prévisibles et une équipe prête à assumer la sécurité et l’exploitation. Une infrastructure gérée justifie son coût lorsque la reprise des transferts, les sources distantes, les fichiers volumineux, le traitement, les destinations multiples ou la récupération après incident constitueraient un produit à part entière.
Que doit contenir un guide de téléversement propre à un framework ?
Un guide consacré à un framework devrait se concentrer sur la maintenabilité du code, le comportement au cours du cycle de vie, l’autorisation côté serveur, la récupération après incident et les tests propres à ce framework. Consultez les références liées sur la reprise des transferts et les API pour connaître les contrats exacts du protocole et des requêtes, et évaluez les fournisseurs selon les exigences architecturales plus larges présentées ci-dessus.
Uppy nécessite-t-il Transloadit ?
Non. Uppy est un outil de téléversement open source qui fonctionne aussi indépendamment avec un bucket S3, un serveur tus ou un autre point de terminaison de téléversement compatible. Son plugin Transloadit assure l’intégration avec des flux de travail gérés de téléversement, de validation, de traitement et d’export. Choisissez Uppy avec un stockage direct lorsque le transfert est la tâche à accomplir ; envisagez Uppy avec Transloadit lorsque les fichiers téléversés nécessitent aussi un flux de travail de traitement géré.
Puis-je utiliser une API gérée de téléversement de fichiers avec mon propre stockage ?
Oui. Dans cet exemple, Uppy téléverse les fichiers vers Transloadit, l’Assembly valide l’image et crée un aperçu, puis /s3/store exporte l’original accepté et l’aperçu vers votre bucket S3 à l’aide des ensembles d’informations d’identification de Template enregistrés. Il s’agit d’un transfert du navigateur vers Transloadit, puis vers S3, et non d’un téléversement direct du navigateur vers S3 : les octets des fichiers et les résultats temporaires passent par Transloadit. Votre application contrôle l’accès au stockage durable, la conservation et la publication.