Get to know MDN better
Cette page a été traduite à partir de l'anglais par la communauté. Vous pouvez contribuer en rejoignant la communauté francophone sur MDN Web Docs.
Grâce à l'API File, une application ou un site web peut demander à la personne de choisir des fichiers locaux et en lire les contenus. La sélection peut être effectuée à l'aide d'un élément <input type="file"> ou à l'aide d'un glisser-déposer.
Prenons ce fragment de HTML :
L'API File permet d'accéder à un objet FileList qui contient des objets File représentant les fichiers sélectionnés par l'utilisatrice ou l'utilisateur.
L'attribut multiple placé sur l'élément input permet de sélectionner plusieurs fichiers.
On peut accéder au premier fichier sélectionné grâce à un sélecteur DOM classique :
Il est aussi possible (même si ça n'est pas obligatoire) d'accéder à la liste FileList lors de l'évènement change. Pour cela, on utilisera EventTarget.addEventListener() pour ajouter un gestionnaire d'évènement sur change, comme ceci :
L'objet FileList fourni par le DOM liste l'ensemble des fichiers sélectionnés par la personne, chacun étant représenté par un objet File. On peut connaître le nombre de fichiers sélectionnés en consultant la valeur de la propriété length de la liste :
Les objets File individuels peuvent être récupérés depuis la liste en utilisant les indices, comme pour un tableau.
Trois propriétés des objets File fournissent des informations utiles sur les fichiers.
nameLe nom du fichier sous la forme d'une chaîne de caractères en lecture seule. Il s'agit uniquement du nom du fichier, aucune information n'est fournie sur l'emplacement.
sizeLa taille du fichier, exprimée en octets, sous la forme d'un entier en lecture seule sur 64 bits.
typeLe type MIME du fichier, sous la forme d'une chaîne de caractères en lecture seule ou "" si le type du fichier n'a pu être déterminé.
Dans l'exemple qui suit, on illustre comment utiliser la propriété size.
Il est possible de masquer l'élément <input> et de présenter sa propre interface pour l'ouverture du sélecteur de fichiers et d'afficher par ailleurs la sélection de fichier. Pour obtenir ce résultat, on pourra mettre en forme le champ <input> avec display:none et appeler la méthode click() sur l'élément <input>.
Prenons ce fragment de code HTML :
Le code qui gère l'évènement click pourra ressembler à :
Vous pouvez mettre en forme <button> comme bon vous semble.
Afin d'ouvrir le sélecteur de fichier sans utiliser de JavaScript (c'est-à-dire sans la méthode click()), on pourra utiliser un élément <label> à la place. Cependant, il faut ici que l'élément <input> ne soit pas masqué à l'aide de display: none (ni à l'aide de visibility: hidden), car le libellé ne serait alors pas accessible au clavier. Il faut utiliser la technique visually-hidden à la place.
Prenons ce fragment de code HTML :
Et ce fragment de code CSS :
Il n'est ici pas nécessaire d'ajouter de code JavaScript pour invoquer fileElem.click(). On peut ici mettre en forme l'élément <label> comme bon nous semble. Il faudra fournir une indication visuelle pour l'état du focus sur le champ masqué sur le libellé, que ce soit un contour comme ci-avant (avec outline ou une couleur d'arrière-plan (background-color), ou une ombre portée (box-shadow).
Il est aussi possible de permettre la sélection de fichier grâce au glisser-déposer.
La première étape consiste à former une zone de dépôt. La zone de votre contenu qui acceptera le dépôt pourra varier selon le design de votre application, mais on pourra facilement construire un élément prêt à recevoir les évènements de dépôt :
Dans cet exemple, on utilise un élément avec l'identifiant dropbox comme zone de dépôt. Pour ce faire, on ajoute des gestionnaires d'évènements pour dragenter, dragover, et drop.
Nous n'avons pas à nous préoccuper de dragenter et dragover dans notre exemple, nous allons donc aller à l'essentiel et empêcher l'action par défaut du navigateur :
La partie vraiment intéressante se situe dans la fonction drop() :
Ici, on récupère la propriété dataTransfer de l'évènement, puis on récupère la liste de fichiers à partir de celle-ci. On passe alors cette liste à la fonction handleFiles(). Désormais, on peut utiliser la même logique, que les fichiers aient été sélectionnés via un élément <input> ou avec un glisser-déposer.
Prenons comme exemple un site web de partage de photos dans lequel on veut des vignettes de prévisualisation des images sélectionnées avant qu'elles soient effectivement enregistrées sur le site. On peut construire un élément <input> et/ou une zone de dépôt comme indiqué avant et appeler la fonction handleFiles() qui suit.
Dans la boucle qui parcourt les fichiers, on regarde la propriété type de chaque fichier afin de déterminer si son type MIME commence avec la chaîne de caractères "image/". Pour chaque fichier qui est une image, on crée un nouvel élément img. On pourra utiliser CSS pour mettre en forme les vignettes (y compris leur taille).
Chaque image se voit dotée de la classe obj, pour permettre de les identifier dans le DOM. On ajoute un attribut file à chaque image en y associant l'objet File correspondant. Cela permettra de récupérer les images pour les enregistrer plus tard. On utilise Node.appendChild() afin d'ajouter la vignette à la zone de prévisualisation dans le document.
Ensuite, on construit un objet FileReader afin de gérer le chargement asynchrone de l'image et son rattachement à l'élément <img> correspondant. Après avoir créé ce nouvel objet, on paramètre sa fonction onload puis on appelle readAsDataURL() afin de commencer l'opération de lecture en arrière-plan. Lorsque le contenu du fichier image aura été chargé, il sera converti en une URL de données qui sera passée à la fonction de rappel onload(). Dans notre exemple, on change l'attribut src de l'élément <img> pour utiliser l'image chargée et la faire apparaître comme vignette à l'écran.
Les méthodes URL.createObjectURL() et URL.revokeObjectURL() permet de créer des chaînes de caractères étant des URL référençant toute donnée à laquelle on accède via un objet File du DOM, y compris les fichiers locaux sur l'ordinateur de l'utilisatrice ou de l'utilisateur.
Lorsqu'on dispose d'un objet File qu'on veut manipuler sous la forme d'une URL, on pourra créer une URL d'objet ainsi :
Une URL d'objet est une chaîne de caractères identifiant l'objet File. À chaque appel de URL.createObjectURL(), c'est une URL d'objet unique qui est créée, mais si une URL d'objet avait déjà été créée pour un même objet. Chacune de ces URL doit être libérée. Cette libération a lieu automatiquement lorsque le document est déchargé. Si votre page utilise les URL d'objet dynamiquement, les URL doivent être libérées explicitement en appelant URL.revokeObjectURL() :
Dans cet exemple, on utilise des URL d'objets pour afficher des vignettes d'image et on affiche également d'autres informations sur les fichiers comme leur nom ou leur taille.
Voici le fragment de HTML pour l'interface utilisateur :
Cela nous donne notre élément <input> ainsi qu'un lien pour ouvrir le sélecteur de fichier (en effet, le champ de saisie est masqué, voir la section Masquer l'élément <input> et utiliser la méthode click() pour plus de détails).
La méthode handleFiles() utilisée ici est la suivante :
Pour commencer, on récupère l'élément <div> qui a l'identifiant fileList. Il s'agit du bloc dans lequel on placera notre liste de fichier ainsi que nos vignettes.
Si l'objet FileList passé à handleFiles() vaut null, on met à jour le code HTML du bloc pour afficher « Aucun fichier sélectionné ! ». Sinon, on construit la liste de fichier comme suit :
Voici le résultat de cet exemple :
On peut également vouloir autoriser le téléversement (upload) des fichiers sélectionnés sur le serveur (comme les images sélectionnées dans l'exemple précédent). On peut faire ceci de façon asynchrone.
Si on poursuit avec le code de construction des vignettes de l'exemple précédent, on peut exploiter la classe obj de chaque vignette et manipuler la propriété file de chaque élément correspondant qui contient l'objet File correspondant. Cela nous permet de collecter toutes les images sélectionnées à l'aide de Document.querySelectorAll() :
À la deuxième ligne de ce fragment, on récupère un objet NodeList appelé imgs qui contient tous les éléments du document ayant la classe obj. Ici, cela correspondra aux vignettes. Avec cette liste, on peut la parcourir et créer une nouvelle instance de FileUpload pour chaque, dont le rôle sera de gérer le téléversement du fichier correspondant vers le serveur.
La fonction FileUpload prend deux arguments, un élément <img> et un fichier à partir duquel lire les données de l'image.
La fonction FileUpload() écrite ici crée un indicateur de progression puis crée une requête XMLHttpRequest pour gérer l'envoi des données.
Avant d'envoyer effectivement les données, plusieurs étapes préparatoires ont lieu :
Dans l'exemple qui suit, on utilise du code PHP pour le serveur et du code JavaScript pour le client afin d'illustrer le téléversement asynchrone d'un fichier.
On peut manipuler les fichiers d'autres formats de la même façon. Voici comment prévisualiser des vidéos sélectionnées :
Cette page a été modifiée le 2 nov. 2025 par les contributeur·ice·s du MDN.
Votre modèle pour un internet meilleur.
Visitez la société mère à but non lucratif de Mozilla Corporation, la Fondation Mozilla.
Certaines parties de ce contenu sont protégées par le droit d'auteur ©1998—2026 des contributeurs individuels de mozilla.org. Contenu disponible sous une licence Creative Commons.