Objekt třídy File je zděděn z Blob a je rozšířen o schopnosti týkající se souborového systému.
Je možné ho získat dvěma způsoby.
Prvním je konstruktor, podobně jako Blob:
new File(částiSouboru, názevSouboru, [volby])
částiSouboru– je pole hodnot Blob/BufferSource/String.názevSouboru– řetězec s názvem souboru.volby– nepovinný objekt:lastModified– časové razítko (celočíselné datum) poslední změny.
Druhým, častějším způsobem je získání souboru z <input type="file">, přetažení nebo jiného prohlížečového rozhraní. V takovém případě soubor získá tyto informace z operačního systému.
Jelikož File je zděděn z Blob, objekty File mají stejné vlastnosti jako Blob a navíc:
name– název souboru,lastModified– časové razítko poslední změny.
Tímto způsobem můžeme získat objekt File z <input type="file">:
<input type="file" onchange="zobrazSoubor(this)">
<script>
function zobrazSoubor(vstup) {
let soubor = vstup.files[0];
alert(`Název souboru: ${soubor.name}`); // např. my.png
alert(`Naposledy změněn: ${soubor.lastModified}`); // např. 1552830408824
}
</script>
Ve vstupu je možné vybrat více souborů, proto vstup.files je objekt podobný poli, který je obsahuje. Zde máme pouze jeden soubor, takže prostě vezmeme vstup.files[0].
FileReader
FileReader je objekt, jehož jediným smyslem je načítat data z objektů Blob (a tedy i File).
Data doručuje pomocí událostí, neboť načítání z disku může nějaký čas trvat.
Konstruktor:
let reader = new FileReader(); // bez argumentů
Hlavní metody:
readAsArrayBuffer(blob)– načte data v binárním formátuArrayBuffer.readAsText(blob, [kódování])– načte data jako textový řetězec se zadaným kódováním (standardněutf-8).readAsDataURL(blob)– načte binární data a zakóduje je do datového URL v base64.abort()– zruší prováděnou operaci.
Volba metody read* závisí na tom, kterému formátu dáváme přednost a jak chceme tato data použít.
readAsArrayBuffer– pro binární soubory, pro provádění operací nízké úrovně. Operace vysoké úrovně, např. vyjímání části dat, jsou veFilezděděny zBlob, takže je můžeme volat rovnou bez načítání.readAsText– pro textové soubory, když chceme získat řetězec.readAsDataURL– kdybychom chtěli použít data vsrcznačkyimgnebo jiné. Pro tento účel existuje alternativa k načítání souboru, kterou jsme probrali v kapitole Blob:URL.createObjectURL(soubor).
Když načítání probíhá, nastávají tyto události:
loadstart– načítání začalo.progress– nastává během načítání.load– načítání skončilo bez chyb.abort– volánoabort().error– nastala chyba.loadend– načítání skončilo, ať už úspěšně nebo s chybou.
Když načítání skončilo, můžeme přistupovat k výsledku následovně:
reader.resultje výsledek (pokud skončilo úspěšně),reader.errorje chyba (pokud selhalo).
Nejčastěji používanými událostmi jsou bezpochyby load a error.
Příklad načítání souboru:
<input type="file" onchange="načtiSoubor(this)">
<script>
function načtiSoubor(vstup) {
let soubor = vstup.files[0];
let reader = new FileReader();
reader.readAsText(soubor);
reader.onload = function() {
console.log(reader.result);
};
reader.onerror = function() {
console.log(reader.error);
};
}
</script>
FileReader pro blobyJak jsme zmínili v kapitole Blob, FileReader umí načítat nejen soubory, ale všechny bloby.
S jeho pomocí můžeme převést blob na jiný formát:
readAsArrayBuffer(blob)– naArrayBuffer,readAsText(blob, [kódování])– na řetězec (alternativa kTextDecoder),readAsDataURL(blob)– na datové URL v base64.
FileReaderSyncPro Web Workers existuje i synchronní varianta FileReader, nazvaná FileReaderSync.
Jeho načítací metody read* negenerují události, ale vracejí výsledek, stejně jako běžné funkce.
To je však možné jen uvnitř Web Workeru, protože prodlevy v synchronních voláních, které mohou při načítání ze souborů nastat, nejsou ve Web Workers tak důležité. Nemají vliv na stránku.
Shrnutí
Objekty File jsou zděděny z Blob.
Kromě metod a vlastností Blob mají objekty File i vlastnosti name a lastModified a vnitřní schopnost číst ze souborového systému. Objekty File zpravidla získáváme z uživatelského vstupu, například <input> nebo událostí přetažení (ondragend).
Objekty FileReader umějí číst ze souboru nebo blobu, a to v jednom ze tří formátů:
- Řetězec (
readAsText). ArrayBuffer(readAsArrayBuffer).- Datové URL, zakódované pomocí base64 (
readAsDataURL).
V mnoha případech však nemusíme načíst obsah souboru. Můžeme vytvořit krátké URL voláním URL.createObjectURL(soubor) a přiřadit je do <a> nebo <img>, stejně jako jsme to dělali s bloby. Tímto způsobem můžeme stáhnout soubor nebo jej zobrazit jako obrázek, jako součást plátna a podobně.
A pokud chceme poslat File po síti, je to také snadné: síťová API, např. XMLHttpRequest nebo fetch, přirozeně přijímají objekty File.
Komentáře
<code>, pro několik řádků je obalte značkou<pre>, pro více než 10 řádků vložte odkaz na pískoviště (plnkr, jsbin, codepen…)