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â¦)