Lâobject File hérite de Blob et est étendu avec des capacités liées au système de fichiers.
Il y a deux façons de lâobtenir.
Premièrement, il y a un constructeur, similaire à Blob:
new File(fileParts, fileName, [options])
filePartsâ est un tableau de valeurs Blob / BufferSource / Chaîne de caractères.fileNameâ chaînes de caractères contenant le nom du fichier.optionsâ objet optionnel:lastModifiedâ lâhorodatage (date entière) de la dernière modification.
Deuxièmement, le plus souvent, nous obtenons un fichier avec <input type="file">, en glisser-déposer ou dâautres interfaces de navigateur. Dans ce cas, le fichier obtient ces informations du système dâexploitation.
Comme File hérite de Blob, les objets File ont les mêmes propriétés, plus:
nameâ le nom du fichier,lastModifiedâ lâhorodatage de la dernière modification.
Voici comment nous pouvons obtenir un objet File depuis <input type="file">:
<input type="file" onchange="showFile(this)">
<script>
function showFile(input) {
let file = input.files[0];
alert(`File name: ${file.name}`); // e.g my.png
alert(`Last modified: ${file.lastModified}`); // e.g 1552830408824
}
</script>
Lâentrée peut sélectionner plusieurs fichiers, donc input.files est un objet de type tableau. Ici, nous nâavons quâun seul fichier, donc nous prenons juste input.files[0].
FileReader
FileReader est un objet dont le seul but est de lire les données des objets Blob (et donc aussi File).
Il fournit les données à lâaide dâévénements, car la lecture à partir du disque peut prendre du temps.
Le constructeur:
let reader = new FileReader(); // aucun argument
Les méthodes principales:
readAsArrayBuffer(blob)â lit les données au format binaireArrayBuffer.readAsText(blob, [encoding])â lit les données sous forme de chaîne de caractères avec lâencodage donné (utf-8par défaut).readAsDataURL(blob)â lit les données binaires et les encode en base64 comme URL de données.abort()â annule lâopération.
Le choix de la méthode read* dépend du format que nous préférons, comment nous allons utiliser les données.
readAsArrayBufferâ pour les fichiers binaires, pour effectuer des opérations binaires de bas niveau. Pour les opérations de haut niveau, comme le découpage,Filehérite deBlob, nous pouvons donc les appeler directement, sans lire.readAsTextâ pour les fichiers texte, lorsque nous souhaitons obtenir une chaîne de caractères.readAsDataURLâ quand nous utilisons ces données danssrcpourimgou une autre balise. Il existe une alternative à la lecture dâun fichier, comme expliqué dans le chapitre Blob:URL.createObjectURL(file).
Au fur et à mesure de la lecture, il y a des événements:
loadstartâ chargement commencé.progressâ se produit pendant la lecture.loadâ aucune erreur, lecture terminée.abortâabort()est appelée.errorâ une erreur est survenue.loadendâ lecture terminée avec succès ou échec.
Lorsque la lecture est terminée, nous pouvons accéder au résultat comme:
reader.resultest le résultat (en cas de succès)reader.errorest lâerreur (en cas dâéchec).
Les événements les plus utilisés sont load et error.
Voici un exemple de lecture dâun fichier:
<input type="file" onchange="readFile(this)">
<script>
function readFile(input) {
let file = input.files[0];
let reader = new FileReader();
reader.readAsText(file);
reader.onload = function() {
console.log(reader.result);
};
reader.onerror = function() {
console.log(reader.error);
};
}
</script>
FileReader pour les objets blobComme mentionné dans le chapitre Blob, FileReader peut lire non seulement les fichiers, mais tous les objets blob.
Nous pouvons lâutiliser pour convertir un blob dans un autre format :
readAsArrayBuffer(blob)â enArrayBuffer,readAsText(blob, [encoding])â en chaîne de caractères (une alternative ÃTextDecoder),readAsDataURL(blob)â en URL des données encoder en base64.
FileReaderSync est disponible dans Web WorkersPour les Web Workers, il existe également une variante synchrone de FileReader, appelée FileReaderSync.
Ses méthodes de lecture read* ne génèrent pas dâévénements, mais renvoient plutôt un résultat, comme le font les fonctions régulières.
Cependant, ce ne fonctionne quâà lâintérieur dâun Web Worker, car les retards dans les appels synchrones qui sont possibles lors de la lecture à partir de fichiers, sont moins importants dans les Web Workers . Ils nâaffectent pas la page.
Résumé
Les objets File héritent de Blob.
En plus des méthodes et propriétés Blob, les objets File ont également les propriétés name et lastModified, ainsi que la capacité interne de lire à partir du système de fichiers. Nous obtenons généralement des objets File à partir de lâentrée utilisateur, comme un <input> ou lâévénement DragânâDrop (ondragend).
les objets FileReader peuvent lire à partir dâun fichier ou dâun objet blob, dans lâun des trois formats :
- Chaînes de caractères (
readAsText). ArrayBuffer(readAsArrayBuffer).- URL des données, encodé en base64 (
readAsDataURL).
Dans de nombreux cas cependant, nous nâavons pas à lire le contenu du fichier. Tout comme nous lâavons fait avec les blobs, nous pouvons créer une URL courte avec URL.createObjectURL(fichier) et lâassigner à <a> ou <img>. De cette façon, le fichier peut être téléchargé ou affiché sous forme dâimage, comme partie de canevas, etcâ¦
Et si nous voulons envoyer un File sur un réseau, câest aussi simple: une API réseau comme XMLHttpRequest ou fetch accepte nativement les objets File.
Commentaires
<code>, pour plusieurs lignes â enveloppez-les avec la balise<pre>, pour plus de 10 lignes - utilisez une sandbox (plnkr, jsbin, codepenâ¦)