ÐбÑÐµÐºÑ File наÑледÑеÑÑÑ Ð¾Ñ Ð¾Ð±ÑекÑа Blob и Ð¾Ð±Ð»Ð°Ð´Ð°ÐµÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑми по взаимодейÑÑÐ²Ð¸Ñ Ñ Ñайловой ÑиÑÑемой.
ÐÑÑÑ Ð´Ð²Ð° ÑпоÑоба его полÑÑиÑÑ.
Ðо-пеÑвÑÑ
, еÑÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑ, поÑ
ожий на Blob:
new File(fileParts, fileName, [options])
filePartsâ маÑÑив знаÑенийBlob/BufferSource/ÑÑÑоки.fileNameâ Ð¸Ð¼Ñ Ñайла, ÑÑÑока.optionsâ необÑзаÑелÑнÑй обÑÐµÐºÑ Ñо ÑвойÑÑвом:lastModifiedâ даÑа поÑледнего Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² ÑоÑмаÑе ÑаймÑÑамп (Ñелое ÑиÑло).
Ðо-вÑоÑÑÑ
, ÑаÑе вÑего Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем Ñайл из <input type="file"> или ÑеÑез пеÑеÑаÑкивание Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÑÑи, или из дÑÑгиÑ
инÑеÑÑейÑов бÑаÑзеÑа. Ð ÑÑом ÑлÑÑае Ñайл полÑÑÐ°ÐµÑ ÑÑÑ Ð¸Ð½ÑоÑмаÑÐ¸Ñ Ð¸Ð· ÐС.
Так как File наÑледÑÐµÑ Ð¾Ñ Blob, Ñ Ð¾Ð±ÑекÑов File еÑÑÑ Ñе же ÑвойÑÑва плÑÑ:
nameâ Ð¸Ð¼Ñ Ñайла,lastModifiedâ ÑаймÑÑамп Ð´Ð»Ñ Ð´Ð°ÑÑ Ð¿Ð¾Ñледнего изменениÑ.
Ð ÑÑом пÑимеÑе Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем обÑÐµÐºÑ File из <input type="file">:
<input type="file" onchange="showFile(this)">
<script>
function showFile(input) {
let file = input.files[0];
alert(`File name: ${file.name}`); // напÑимеÑ, my.png
alert(`Last modified: ${file.lastModified}`); // напÑимеÑ, 1552830408824
}
</script>
ЧеÑез <input> можно вÑбÑаÑÑ Ð½ÐµÑколÑко Ñайлов, поÑÑÐ¾Ð¼Ñ input.files â пÑевдомаÑÑив вÑбÑаннÑÑ
Ñайлов. ÐдеÑÑ Ñ Ð½Ð°Ñ ÑолÑко один Ñайл, поÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð¿ÑоÑÑо беÑÑм input.files[0].
FileReader
FileReader обÑекÑ, ÑÐµÐ»Ñ ÐºÐ¾ÑоÑого ÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе из Blob (и, ÑледоваÑелÑно, из File Ñоже).
ÐаннÑе пеÑедаÑÑÑÑ Ð¿Ñи помоÑи ÑобÑÑий, Ñак как ÑÑение Ñ Ð´Ð¸Ñка Ð¼Ð¾Ð¶ÐµÑ Ð·Ð°Ð½ÑÑÑ Ð²ÑемÑ.
ÐонÑÑÑÑкÑоÑ:
let reader = new FileReader(); // без аÑгÑменÑов
ÐÑновнÑе меÑодÑ:
readAsArrayBuffer(blob)â ÑÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе какArrayBufferreadAsText(blob, [encoding])â ÑÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе как ÑÑÑÐ¾ÐºÑ (кодиÑовка по ÑмолÑаниÑ:utf-8)readAsDataURL(blob)â ÑÑиÑаÑÑ Ð´Ð°Ð½Ð½Ñе как base64-кодиÑованнÑй URL.abort()â оÑмениÑÑ Ð¾Ð¿ÐµÑаÑиÑ.
ÐÑÐ±Ð¾Ñ Ð¼ÐµÑода Ð´Ð»Ñ ÑÑÐµÐ½Ð¸Ñ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ Ñого, какой ÑоÑÐ¼Ð°Ñ Ð¼Ñ Ð¿ÑедпоÑиÑаем, как Ð¼Ñ Ñ Ð¾Ñим далее иÑполÑзоваÑÑ Ð´Ð°Ð½Ð½Ñе.
readAsArrayBufferâ Ð´Ð»Ñ Ð±Ð¸Ð½Ð°ÑнÑÑ Ñайлов, Ð´Ð»Ñ Ð½Ð¸Ð·ÐºÐ¾ÑÑовневой побайÑовой ÑабоÑÑ Ñ Ð±Ð¸Ð½Ð°ÑнÑми даннÑми. ÐÐ»Ñ Ð²ÑÑокоÑÑовневÑÑ Ð¾Ð¿ÐµÑаÑий ÑFileеÑÑÑ Ñвои меÑодÑ, ÑнаÑледованнÑе оÑBlob, напÑимеÑ,slice, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ вÑзваÑÑ Ð¸Ñ Ð½Ð°Ð¿ÑÑмÑÑ.readAsTextâ Ð´Ð»Ñ ÑекÑÑовÑÑ Ñайлов, когда Ð¼Ñ Ñ Ð¾Ñим полÑÑиÑÑ ÑÑÑокÑ.readAsDataURLâ когда Ð¼Ñ Ñ Ð¾Ñим иÑполÑзоваÑÑ Ð´Ð°Ð½Ð½Ñе вsrcдлÑimgили дÑÑгого Ñега. ÐÑÑÑ Ð°Ð»ÑÑеÑнаÑива â можно не ÑиÑаÑÑ Ñайл, а вÑзваÑÑURL.createObjectURL(file), деÑали в главе Blob.
РпÑоÑеÑÑе ÑÑÐµÐ½Ð¸Ñ Ð¿ÑоиÑÑ Ð¾Ð´ÑÑ ÑледÑÑÑие ÑобÑÑиÑ:
loadstartâ ÑÑение наÑаÑо.progressâ ÑÑабаÑÑÐ²Ð°ÐµÑ Ð²Ð¾ вÑÐµÐ¼Ñ ÑÑÐµÐ½Ð¸Ñ Ð´Ð°Ð½Ð½ÑÑ .loadâ Ð½ÐµÑ Ð¾Ñибок, ÑÑение оконÑено.abortâ вÑзванabort().errorâ пÑоизоÑла оÑибка.loadendâ ÑÑение завеÑÑено (ÑÑпеÑно или неÑ).
Ðогда ÑÑение законÑено, Ð¼Ñ Ñможем полÑÑиÑÑ Ð´Ð¾ÑÑÑп к его ÑезÑлÑÑаÑÑ ÑледÑÑÑим обÑазом:
reader.resultÑезÑлÑÑÐ°Ñ ÑÑÐµÐ½Ð¸Ñ (еÑли оно ÑÑпеÑно)reader.errorобÑÐµÐºÑ Ð¾Ñибки (пÑи неÑдаÑе).
Ðаиболее ÑаÑÑо иÑполÑзÑемÑе ÑобÑÑÐ¸Ñ â ÑÑо, конеÑно же, load и error.
ÐÐ¾Ñ Ð¿ÑÐ¸Ð¼ÐµÑ ÑÑÐµÐ½Ð¸Ñ Ñайла:
<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 Ð´Ð»Ñ BlobÐак ÑпоминалоÑÑ Ð² главе Blob, FileReader ÑабоÑÐ°ÐµÑ Ð´Ð»Ñ Ð»ÑбÑÑ
обÑекÑов Blob, а не ÑолÑко Ð´Ð»Ñ Ñайлов.
ÐоÑÑÐ¾Ð¼Ñ Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ иÑполÑзоваÑÑ ÐµÐ³Ð¾ Ð´Ð»Ñ Ð¿ÑеобÑÐ°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ Blob в дÑÑгой ÑоÑмаÑ:
readAsArrayBuffer(blob)â вArrayBuffer,readAsText(blob, [encoding])â в ÑÑÑÐ¾ÐºÑ (алÑÑеÑнаÑиваTextDecoder),readAsDataURL(blob)â в ÑоÑÐ¼Ð°Ñ base64-кодиÑованного URL.
FileReaderSyncÐÐ»Ñ Ð²ÐµÐ±-воÑкеÑов доÑÑÑпен ÑинÑ
ÑоннÑй ваÑÐ¸Ð°Ð½Ñ FileReader, именÑемÑй FileReaderSync.
Ðго меÑÐ¾Ð´Ñ ÑÑиÑÑÐ²Ð°Ð½Ð¸Ñ read* не генеÑиÑÑÑÑ ÑобÑÑиÑ, а возвÑаÑаÑÑ ÑезÑлÑÑаÑ, как ÑÑо делаÑÑ Ð¾Ð±ÑÑнÑе ÑÑнкÑии.
Ðо ÑÑо ÑолÑко внÑÑÑи веб-воÑкеÑа, поÑколÑÐºÑ Ð·Ð°Ð´ÐµÑжки в ÑÐ¸Ð½Ñ ÑоннÑÑ Ð²ÑÐ·Ð¾Ð²Ð°Ñ , коÑоÑÑе Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ñ Ð¿Ñи ÑÑении из Ñайла, в веб-воÑкеÑÐ°Ñ Ð¼ÐµÐ½ÐµÐµ важнÑ. Ðни не влиÑÑÑ Ð½Ð° ÑÑÑаниÑÑ.
ÐÑого
File обÑекÑÑ Ð½Ð°ÑледÑÑÑ Ð¾Ñ Blob.
Ðомимо меÑодов и ÑвойÑÑв Blob, обÑекÑÑ File Ñакже имеÑÑ ÑвойÑÑва name и lastModified плÑÑ Ð²Ð½ÑÑÑеннÑÑ Ð²Ð¾Ð·Ð¼Ð¾Ð¶Ð½Ð¾ÑÑÑ ÑÑÐµÐ½Ð¸Ñ Ð¸Ð· Ñайловой ÑиÑÑемÑ. ÐбÑÑно Ð¼Ñ Ð¿Ð¾Ð»ÑÑаем обÑекÑÑ File из полÑзоваÑелÑÑкого ввода, напÑимеÑ, ÑеÑез <input> или пеÑеÑаÑкиванием Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ Ð¼ÑÑи, в ÑобÑÑии dragend.
ÐбÑекÑÑ FileReader могÑÑ ÑиÑаÑÑ Ð¸Ð· Ñайла или Blob в одном из ÑÑÑÑ
ÑоÑмаÑов:
- СÑÑока (
readAsText). ArrayBuffer(readAsArrayBuffer).- URL в ÑоÑмаÑе base64 (
readAsDataURL).
Ðднако, во многиÑ
ÑлÑÑаÑÑ
нам не нÑжно ÑиÑаÑÑ ÑодеÑжимое Ñайла. Ðак и в ÑлÑÑае Ñ Blob, Ð¼Ñ Ð¼Ð¾Ð¶ÐµÐ¼ ÑоздаÑÑ ÐºÐ¾ÑоÑкий URL Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ URL.createObjectURL(file) и иÑполÑзоваÑÑ ÐµÐ³Ð¾ в Ñеге <a> или <img>. Таким обÑазом, Ñайл Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ Ð·Ð°Ð³ÑÑжен или показан в виде изобÑажениÑ, как ÑаÑÑÑ canvas и Ñ.д.
РеÑли Ð¼Ñ ÑобиÑаемÑÑ Ð¾ÑпÑавиÑÑ File по ÑеÑи, Ñо ÑÑо Ñакже легко, поÑколÑÐºÑ Ð² ÑеÑевÑе меÑодÑ, Ñакие как XMLHttpRequest или fetch, вÑÑÑоена возможноÑÑÑ Ð¾ÑÑÑлки File.
ÐомменÑаÑии
<code>, Ð´Ð»Ñ Ð½ÐµÑколÑÐºÐ¸Ñ ÑÑÑок кода — Ñег<pre>, еÑли болÑÑе 10 ÑÑÑок — ÑÑÑÐ»ÐºÑ Ð½Ð° пеÑоÑниÑÑ (plnkr, JSBin, codepenâ¦)