Points clés à retenir
- Choisissez le protocole serveur et les exigences de reprise avant de comparer les composants visuels des bibliothèques.
- Considérez le découpage en blocs et la possibilité de reprise comme des propriétés distinctes, puis vérifiez la reprise après un rechargement de page.
- Comparez le contrat du point de terminaison, l’accessibilité, les états d’échec et les modalités de maintenance avec les mêmes données de test.
Le meilleur composant de téléversement de fichiers JavaScript n’est pas celui qui possède la plus longue liste de fonctionnalités. C’est celui dont le modèle d’état, le contrat de transfert, l’interface et le comportement en cas d’échec correspondent au produit que votre équipe peut maintenir. Uppy, FilePond et Dropzone se rejoignent sur la sélection de fichiers et le suivi de progression, puis divergent nettement dès qu’une panne réseau survient ou qu’un serveur doit réconcilier des opérations partielles.
L’essentiel
- Utilisez Uppy pour un flux de travail de téléversement modulaire avec tus, des sources distantes ou une intégration directe à Transloadit.
- Utilisez FilePond lorsqu’une expérience soignée de champ de fichier et des plugins dédiés aux images comptent davantage que la portabilité du protocole.
- Utilisez Dropzone pour un flux XHR simple par glisser-déposer lorsque son contrat de gestion des blocs et son profil de maintenance conviennent à l’application.
Commencer par le contrat de téléversement, pas par la zone de dépôt
Les trois bibliothèques peuvent donner une apparence moderne à un champ de fichier. C’est la partie la moins coûteuse d’un téléversement en production. Décidez d’abord où vont les octets, quel protocole le récepteur utilise, à quel moment un téléversement est conservé durablement et quel identifiant relie la progression dans le navigateur à un enregistrement applicatif. Un téléversement direct vers un stockage objet, un serveur tus, un point de terminaison multipart classique et un service de traitement ont des contrats d’autorisation et de finalisation différents, même lorsque l’interface semble identique.
Cette comparaison retient trois composants de téléversement autonomes pour navigateur qui fournissent des éléments d’interface et documentent un contrat serveur. Définissez précisément la reprise. « Prend en charge les blocs » peut simplement signifier qu’une seule session de page peut réessayer l’envoi d’un bloc ayant échoué. Un flux de travail avec reprise doit conserver une identité de téléversement attribuée par le serveur, déterminer le décalage accepté et poursuivre le transfert en toute sécurité après la perte de l’état côté client. Définissez aussi l’annulation, l’expiration, les requêtes finales dupliquées et ce que l’interface affiche lorsque le transfert est terminé, mais que la validation asynchrone ou le traitement asynchrone a échoué.
Destination des octets
Nommez le premier récepteur et le responsable de la conservation durable au lieu de considérer chaque chemin du navigateur vers un service comme un « téléversement direct ».
Contrat du protocole
Consignez les méthodes, les en-têtes, les identifiants, les règles de décalage, la requête de finalisation et la sémantique des nouvelles tentatives que le serveur doit implémenter.
Finalisation au niveau du produit
Définissez si la réussite signifie que les octets ont été acceptés, que le stockage est durable, que le contenu a été inspecté, que les fichiers dérivés sont terminés ou qu’une ressource a été publiée.
Utiliser Uppy pour des flux de travail modulaires et une infrastructure avec reprise
Uppy sépare son moteur de gestion d’état de ses plugins d’interface et de téléversement. Une équipe peut utiliser Dashboard pour un sélecteur intégré, DragDrop pour une interface plus compacte, Tus pour un point de terminaison avec reprise ou Transloadit pour une Assembly de téléversement et de traitement. Cette composition est utile lorsqu’un seul produit a besoin de plusieurs types de sources ou lorsque l’expérience visible doit évoluer sans remplacer la couche de transfert.
La contrepartie est l’étendue de l’architecture à gérer. La compatibilité des plugins, les styles, la gestion des événements et le point de terminaison choisi nécessitent toujours de la maintenance. Les fournisseurs distants utilisent l’infrastructure Companion plutôt que d’exposer des informations d’identification tierces dans le navigateur ; les équipes peuvent l’héberger elles-mêmes ou utiliser Companion hébergé, inclus avec Transloadit. Uppy constitue un choix par défaut solide pour les transferts volumineux ou peu fiables lorsque le backend utilise déjà tus. C’est aussi le chemin maintenu le plus court vers Transloadit, car le plugin officiel gère la création de l’Assembly et la coordination du téléversement.
Cas les mieux adaptés
Les produits qui ont besoin de la reprise avec tus, de sources distantes, de plusieurs formes d’interface ou du traitement Transloadit dans un même flux de travail observable.
Surveiller de près
Le nombre de plugins, Companion auto-hébergé ou hébergé par Transloadit pour les sources distantes, l’intégration CSS et la responsabilité de la gestion des événements du cycle de vie.
Ne pas supposer
L’utilisation d’Uppy ne rend pas un point de terminaison multipart quelconque capable de reprendre un transfert et ne déplace ni l’autorisation ni la persistance des ressources côté client.
Utiliser FilePond pour un champ de fichier soigné et des plugins d’image
FilePond part d’un élément input et le transforme en champ de fichier compact et configurable. Son catalogue de plugins couvre l’aperçu, le recadrage, le redimensionnement, la transformation, les métadonnées et la validation des images, ce qui le rend intéressant pour les formulaires où les utilisateurs ont besoin d’un retour visuel immédiat sur les images. Les adaptateurs de frameworks peuvent faciliter son intégration naturelle dans un système de composants existant, mais le cycle de vie côté serveur reste régi par un contrat FilePond.
Ce contrat est explicite. Sans découpage en blocs, process accepte un fichier et renvoie un identifiant de fichier côté serveur ; revert supprime un téléversement temporaire ; restore récupère un fichier temporaire dont le téléversement a été interrompu ou précédemment terminé. Avec le découpage en blocs, la requête POST initiale de process ne contient aucun fichier et renvoie un identifiant de transfert. FilePond envoie ensuite des requêtes PATCH pour les blocs et des requêtes HEAD pour la reprise au point de terminaison patch configuré. Cette conception peut convenir lorsque l’application contrôle les deux côtés. Elle n’est pas interchangeable avec tus simplement parce que les deux conceptions envoient des blocs et utilisent des requêtes HEAD.
Cas les mieux adaptés
Les formulaires et les flux de travail axés sur les images qui bénéficient d’une présentation soignée du champ de fichier et de plugins côté client sélectionnés délibérément.
Surveiller de près
L’enregistrement des plugins, le traitement des images côté client sur des appareils aux ressources limitées, le nettoyage des fichiers temporaires et le cycle de vie personnalisé côté serveur.
Ne pas supposer
Qu’une transformation côté client remplace l’inspection faisant autorité côté serveur ou que le découpage en blocs de FilePond permette la reprise avec un point de terminaison tus.
Utiliser Dropzone pour un flux XHR classique par glisser-déposer
Dropzone transforme un élément HTML en zone de téléversement par glisser-déposer, fournit des aperçus et un suivi de progression, et envoie les fichiers via XMLHttpRequest. Sa configuration est simple, et une équipe disposant d’un point de terminaison applicatif classique peut rapidement obtenir une expérience fonctionnelle. Le découpage facultatif en blocs, l’envoi parallèle de blocs, les limites de nouvelles tentatives, la génération de vignettes et le redimensionnement d’images côté client étendent ces possibilités sans nécessiter de framework d’interface distinct.
Le backend prend en charge une plus grande part de la sémantique. Il doit interpréter les champs de blocs de Dropzone, stocker les données partielles en toute sécurité, assembler chaque fichier exactement une fois et distinguer une nouvelle tentative d’un second téléversement. Activer le découpage en blocs ne suffit pas à assurer la reprise après une navigation ou un redémarrage du navigateur. Au moment de la publication, le tag latest de Dropzone sur npm correspond à 6.0.0-beta.2, tandis que la dernière branche stable est 5.9.3 ; l’exemple utilise l’export ESM nommé de la version bêta 6. Fixez la branche de versions souhaitée et testez sa forme d’import au lieu de recopier la configuration d’une version à l’autre.
Cas les mieux adaptés
Les applications existantes avec rendu côté serveur ou côté client qui souhaitent une zone de dépôt configurable reliée à un point de terminaison déjà sous la responsabilité de l’équipe.
Surveiller de près
L’assemblage des blocs, l’incompatibilité entre le découpage en blocs et uploadMultiple, la finalisation idempotente, le nettoyage lié aux nouvelles tentatives, l’accessibilité des aperçus personnalisés et la branche de versions retenue.
Ne pas supposer
Que les nouvelles tentatives d’envoi de blocs dans la page active offrent le même contrat de reprise qu’un protocole avec reprise utilisant des URL de téléversement persistantes.
Comparer les trois selon les mêmes critères
Pour l’architecture de transfert, Uppy offre l’approche la plus claire fondée sur un protocole grâce à son plugin Tus, ainsi qu’un accès direct au traitement grâce à son plugin Transloadit. FilePond dispose d’un cycle de vie documenté entre l’application et le serveur, avec des opérations sur les fichiers temporaires et un protocole facultatif de transfert par blocs. Dropzone utilise des téléversements XHR classiques et ajoute des métadonnées de blocs configurables et des nouvelles tentatives configurables. Aucun de ces contrats ne convient par nature à tous les backends.
Pour la forme de l’interface, FilePond privilégie une expérience compacte de champ de fichier, Uppy va de la gestion d’état sans interface à un Dashboard complet, et Dropzone s’articule autour d’un élément qui devient une zone de dépôt avec aperçus. Pour les flux de travail liés aux images, FilePond propose un large éventail de plugins spécialisés ; Uppy et Dropzone fournissent aussi des aperçus ou des vignettes, mais ne doivent pas être retenus comme outils de traitement des médias faisant autorité. Pour la portabilité, privilégiez un protocole réseau ouvert lorsque la possibilité de changer indépendamment le client ou le serveur compte.
Uppy
Privilégiez cette solution lorsque la composition modulaire, tus, les fournisseurs distants ou un passage de relais officiel vers Transloadit comptent davantage que l’étendue accrue de l’intégration.
FilePond
Privilégiez cette solution lorsqu’un champ de fichier soigné et des plugins d’image conviennent au produit et que l’équipe accepte son cycle de vie spécifique côté serveur.
Dropzone
Privilégiez cette solution lorsqu’une zone de dépôt XHR configurable convient à un point de terminaison existant et que l’équipe peut prendre en charge l’assemblage des blocs et les limites de reprise.
Prototyper chaque bibliothèque avec un véritable contrat serveur
Ces configurations ciblent délibérément trois contrats de point de terminaison différents. L’exemple Uppy nécessite un serveur tus. L’exemple FilePond nécessite des gestionnaires process, patch, revert et restore qui implémentent sa sémantique de gestion des blocs. L’exemple Dropzone nécessite un point de terminaison qui interprète et assemble les blocs Dropzone. Changer le nom du paquet en conservant la même URL ne rend pas le serveur compatible.
Les limites numériques ne sont délibérément pas interchangeables non plus : maxFileSize d’Uppy est exprimé en octets, tandis que maxFilesize de Dropzone est exprimé en mébioctets (MiB). L’exemple FilePond omet un plugin de taille pour rester centré sur son cycle de vie côté serveur ; le code de production doit ajouter et faire respecter une limite appropriée à la fois côté client et côté serveur.
Utilisez les exemples comme base d’expérimentation plutôt que comme mécanisme d’autorisation en production. Délivrez une autorisation de téléversement de courte durée depuis un serveur de confiance, associez-la à l’utilisateur et à l’opération en cours, faites respecter les limites en octets et en nombre au niveau du récepteur, puis renvoyez un identifiant opaque permettant à l’application de réconcilier l’état. Supprimez la journalisation dans la console avant la mise en production et affichez les erreurs dans une zone d’état accessible à proximité du contrôle de téléversement.
import Uppy from '@uppy/core'
import Dashboard from '@uppy/dashboard'
import Tus from '@uppy/tus'
import '@uppy/core/css/style.min.css'
import '@uppy/dashboard/css/style.min.css'
const uppy = new Uppy({
restrictions: {
allowedFileTypes: ['image/*', 'video/*'],
maxFileSize: 500 * 1024 * 1024,
maxNumberOfFiles: 10,
},
})
.use(Dashboard, {
inline: true,
target: '#uppy',
})
.use(Tus, {
endpoint: 'https://uploads.example.com/files/',
retryDelays: [0, 1_000, 3_000, 5_000],
})
uppy.on('complete', ({ successful }) => {
console.log('Uploaded files:', successful)
})import { create, registerPlugin } from 'filepond'
import FilePondPluginFileValidateType from 'filepond-plugin-file-validate-type'
import FilePondPluginImagePreview from 'filepond-plugin-image-preview'
import 'filepond/dist/filepond.min.css'
import 'filepond-plugin-image-preview/dist/filepond-plugin-image-preview.css'
registerPlugin(FilePondPluginFileValidateType, FilePondPluginImagePreview)
const input = document.querySelector('input[type="file"]')
if (!(input instanceof HTMLInputElement)) {
throw new Error('Missing file input')
}
create(input, {
acceptedFileTypes: ['image/*'],
chunkSize: 5_000_000,
chunkUploads: true,
server: {
process: '/api/filepond/process',
patch: '/api/filepond/patch/',
revert: '/api/filepond/revert',
restore: '/api/filepond/restore/',
},
})import { Dropzone } from 'dropzone'
const dropzone = new Dropzone('#dropzone', {
acceptedFiles: 'image/*,video/*',
chunkSize: 2_000_000,
chunking: true,
forceChunking: true,
maxFilesize: 500,
retryChunks: true,
retryChunksLimit: 3,
url: '/api/dropzone/upload',
})
dropzone.on('success', (file, response) => {
console.log('Upload accepted:', file.name, response)
})
dropzone.on('error', (file, message) => {
console.error('Upload failed:', file.name, message)
})Tester le comportement en cas d’échec avant de choisir la meilleure solution
Soumettez chaque candidat aux mêmes données de test et aux mêmes échecs : une image minuscule, une vidéo volumineuse, un fichier de zéro octet, une extension trompeuse, une connexion interrompue, un rechargement de page, une autorisation expirée, une requête finale dupliquée, une annulation par l’utilisateur et un rejet par le serveur après réception de tous les octets. Mesurez les octets retransmis, le délai de reprise, les opérations serveur dupliquées, les fichiers temporaires laissés sans nettoyage et la capacité de l’utilisateur à comprendre l’état.
Testez ensuite ce qu’implique la prise en charge de l’intégration. Vérifiez l’accès au clavier, les déplacements du focus, les annonces d’erreur, la localisation, l’utilisation de la mémoire sur mobile, le comportement au démontage des composants du framework, les mises à jour des dépendances et l’observabilité du point de terminaison. La décision doit préciser la branche de versions, les plugins retenus, le protocole serveur, le responsable de l’état des ressources et le plan de remplacement. Cette documentation compte davantage qu’un classement générique, car elle explique pourquoi le choix reste adapté après le départ du développeur initial.
Reprise après interruption réseau
Interrompez le transfert à plusieurs décalages, rechargez la page et vérifiez précisément quels octets et identifiants serveur sont réutilisés.
Idempotence côté serveur
Répétez les requêtes d’envoi de blocs et de finalisation, puis démontrez qu’un seul téléversement logique crée un seul résultat durable dans l’application.
Accessibilité des états
Vérifiez que la sélection, la progression, l’annulation, le rejet et l’achèvement restent compréhensibles sans glisser-déposer ni perception visuelle.
Stratégie de maintenance
Fixez et mettez à jour les versions des paquets sélectionnés, testez l’intégration réelle en CI et conservez des données de test pour les cas limites du protocole.
Détails techniques à connaître
- Uppy Core gère l’état partagé des téléversements, publie les événements du cycle de vie et impose les restrictions de sélection ; des plugins installés séparément ajoutent des interfaces et des mécanismes de transport, comme Dashboard, Tus ou Transloadit.
- Le plugin Tus d’Uppy délègue le transfert au client tus, de sorte qu’un point de terminaison implémentant le protocole tus peut reprendre à partir d’un décalage de téléversement confirmé par le serveur au lieu de recommencer le transfert du fichier entier.
- Le plugin Transloadit d’Uppy crée des Assemblies, téléverse les fichiers via tus, peut obtenir des paramètres d’Assembly signés grâce à une fonction assemblyOptions qui appelle un serveur de confiance et peut, en option, attendre les résultats de l’encodage.
- FilePond documente les opérations serveur process, revert, restore, load, fetch, patch et remove ; le mode par blocs commence par une requête POST sans fichier, puis envoie les blocs et les requêtes de reprise au point de terminaison patch.
- Dans FilePond, l’aperçu des images, la validation du type de fichier ainsi que le recadrage, le redimensionnement, le filtrage et la transformation des images sont assurés par des plugins facultatifs qu’il faut enregistrer et maintenir de manière délibérée.
- Dropzone téléverse les fichiers via XMLHttpRequest et peut les découper en blocs, réessayer l’envoi des blocs ayant échoué ou téléverser les blocs en parallèle, mais le serveur applicatif doit correctement assembler et finaliser ces blocs.
- Un paramètre côté client définissant les fichiers autorisés ou acceptés améliore les informations fournies à l’utilisateur, mais ne constitue pas une frontière de sécurité, car les requêtes peuvent contourner le code du navigateur et les métadonnées des fichiers peuvent être fausses ou incomplètes.
- Les trois bibliothèques utilisent des sémantiques de point de terminaison, des identifiants, des comportements d’annulation et des métadonnées de blocs différents. Remplacer le composant visible ne préserve donc pas automatiquement le contrat de téléversement du backend.
Une approche pratique
- 1
Consignez la destination requise des octets, le protocole serveur, la période de reprise et l’état final de réussite.
- 2
Réalisez un prototype de chaque candidat sérieux avec le véritable point de terminaison plutôt qu’avec une requête simulée qui réussit.
- 3
Testez l’interruption, le rechargement, la finalisation répétée, le rejet, l’annulation et l’expiration de l’autorisation.
- 4
Choisissez selon l’adéquation mesurée au produit et documentez le contrat client-serveur dont l’équipe assume désormais la responsabilité.
Quand Transloadit est utile
Utilisez le plugin Transloadit maintenu pour Uppy lorsque le navigateur doit créer une Assembly, téléverser via tus et suivre les résultats du traitement. Companion hébergé par Transloadit peut prendre en charge les sources distantes. Une interface FilePond ou Dropzone peut être connectée via une intégration personnalisée, mais votre équipe prend alors en charge cet adaptateur et son comportement de reprise.
Périmètre architectural
Uppy, FilePond et Dropzone sont des bibliothèques de téléversement côté navigateur. Elles peuvent sélectionner des fichiers, afficher la progression et transférer des octets selon un contrat client-serveur configuré, mais elles ne remplacent ni l’autorisation côté serveur, ni l’inspection du contenu, ni le stockage durable, ni le traitement des médias, ni les enregistrements de ressources de l’application.
Questions fréquentes
Quelle est la meilleure bibliothèque JavaScript de téléversement de fichiers ?
Uppy est le choix le mieux adapté à tus, aux sources distantes ou à Transloadit ; FilePond est convaincant pour un champ de fichier soigné orienté image ; Dropzone est utile pour une zone de dépôt XHR classique. Le bon choix est celui dont le protocole serveur et le comportement en cas d’échec correspondent à l’application.
Le téléversement par blocs est-il équivalent au téléversement avec reprise ?
Non. Le découpage en blocs divise un fichier en plusieurs parties. La possibilité de reprise préserve en plus l’identité du téléversement, détermine la progression acceptée et permet de poursuivre le transfert en toute sécurité après une interruption. Évaluez la reprise après un rechargement ou une expiration de l’état au lieu de vérifier uniquement la présence d’une option de découpage en blocs.
FilePond ou Dropzone peuvent-ils téléverser des fichiers vers Transloadit ?
Ces bibliothèques peuvent envoyer des fichiers via une intégration personnalisée, mais Transloadit maintient un plugin Uppy officiel qui coordonne la création de l’Assembly, le téléversement via tus et les résultats. Avec un adaptateur FilePond ou Dropzone, votre équipe prend en charge la conversion entre les contrats et son comportement en cas d’échec.
Les restrictions de type de fichier côté client sécurisent-elles un téléversement ?
Non. Elles fournissent un retour rapide, mais l’appelant peut contourner le code du navigateur et les métadonnées peuvent être trompeuses. Faites respecter l’autorisation, les limites en octets, les règles portant sur le contenu observé et la politique de stockage aux frontières de confiance côté serveur ou traitement.
Faut-il redimensionner les images dans le navigateur avant le téléversement ?
Uniquement comme optimisation facultative de la bande passante ou des aperçus, lorsque la perte de l’original est acceptable. Le traitement dans le navigateur varie selon l’appareil et ne remplace ni l’inspection faisant autorité côté serveur, ni les fichiers dérivés reproductibles, ni la politique de métadonnées, ni la conservation d’un fichier source.
Comment une équipe doit-elle migrer d’une bibliothèque de téléversement à une autre ?
Figez le contrat client-serveur actuel, définissez des identifiants et des états finaux équivalents, testez les deux clients avec les mêmes données de test d’échec et migrez une interface à la fois. Si les protocoles réseau diffèrent, traitez l’adaptateur serveur comme une migration distincte plutôt que comme un remplacement de composant visuel.