ÐбâÑÐºÑ File наÑлÑдÑÑÑÑÑÑ Ð²Ñд Blob Ñа Ð½Ð°Ð´Ð°Ñ Ð´Ð¾Ð´Ð°ÑÐºÐ¾Ð²Ñ Ð¼Ð¾Ð¶Ð»Ð¸Ð²Ð¾ÑÑÑ Ð´Ð»Ñ ÑобоÑи з ÑÐ°Ð¹Ð»Ð¾Ð²Ð¾Ñ ÑиÑÑемоÑ.
Рдва ÑпоÑоби ÑÑвоÑиÑи екземплÑÑ File.
Ðо-пеÑÑе, можна ÑкоÑиÑÑаÑиÑÑ ÐºÐ¾Ð½ÑÑÑÑкÑоÑом ÑÑ
ожим на Blob:
new File(fileParts, fileName, [options])
filePartsâ маÑив знаÑенÑ, Ñо можÑÑÑ Ð¼Ð°Ñи Ñип Blob/BufferSource/String.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}`); // напÑиклад my.png
alert(`ÐаÑа оÑÑаннÑÐ¾Ñ Ð·Ð¼Ñни: ${file.lastModified}`); // напÑиклад 1552830408824
}
</script>
ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ Ð²Ð²ÐµÐ´ÐµÐ½Ð½Ñ (input) дозволÑÑ Ð¾Ð±ÑаÑи декÑлÑка ÑайлÑв Ñазом, ÑÐºÑ Ð±ÑдÑÑÑ Ð´Ð¾ÑÑÑÐ¿Ð½Ñ Ð² обâÑкÑÑ input.files. ÐÑкÑлÑки ÑÑÑ Ð¼Ð¸ заванÑажÑÑмо один Ñайл, Ñо можемо ÑкоÑиÑÑаÑиÑÑ input.files[0].
FileReader
FileReader â обâÑÐºÑ Ð´Ð»Ñ Ð·ÑиÑÑÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ
з Blob, а оÑже Ñ Ð· File Ñакож.
ÐÐ°Ð½Ñ Ð¿ÐµÑедаÑÑÑÑÑ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ Ð¿Ð¾Ð´Ñй, оÑкÑлÑки зÑиÑÑÐ²Ð°Ð½Ð½Ñ Ð´Ð°Ð½Ð¸Ñ Ð· диÑÐºÑ Ð¿Ð¾ÑÑебÑÑ ÑаÑÑ.
ÐонÑÑÑÑкÑоÑ:
let reader = new FileReader(); // без аÑгÑменÑÑв
ÐÑÐ½Ð¾Ð²Ð½Ñ Ð¼ÐµÑоди:
readAsArrayBuffer(blob)â пÑоÑиÑаÑи Ð´Ð°Ð½Ñ Ð² бÑнаÑÐ½Ð¾Ð¼Ñ ÑоÑмаÑÑ Ñ Ð·Ð±ÐµÑегÑи вArrayBuffer.readAsText(blob, [encoding])â пÑоÑиÑаÑи Ð´Ð°Ð½Ñ Ñк ÑекÑÑ Ñз заданим кодÑваннÑм (Ñиповоutf-8).readAsDataURL(blob)â пÑоÑиÑаÑи бÑнаÑÐ½Ñ Ð´Ð°Ð½Ñ Ñа закодÑваÑи Ñ ÑоÑмаÑÑ base64 data url.abort()â вÑдмÑниÑи опеÑаÑÑÑ.
ÐибÑÑ read* меÑÐ¾Ð´Ñ Ð·Ð°Ð»ÐµÐ¶Ð¸ÑÑ Ð²Ñд ÑоÑмаÑÑ Ð´Ð°Ð½Ð¸Ñ
з Ñким ми Ñ
оÑемо пÑаÑÑваÑи.
readAsArrayBufferâ викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ Ð½Ð¸Ð·ÑкоÑÑÐ²Ð½ÐµÐ²Ð¸Ñ Ð¾Ð¿ÐµÑаÑÑй з бÑнаÑними даними. ÐÐ»Ñ Ð²Ð¸ÑокоÑÑÐ²Ð½ÐµÐ²Ð¸Ñ Ð¾Ð¿ÐµÑаÑÑй, Ñк оÑÑÐ¸Ð¼Ð°Ð½Ð½Ñ Ð·ÑÑзÑв, обâÑкÑFileÑÑпадковÑÑÑÑÑÑ Ð²ÑдBlob, ÑÐ¾Ð¼Ñ Ð¹Ð¾Ð³Ð¾ можна викоÑиÑÑовÑваÑи безпоÑеÑеднÑо без ÑиÑÐ°Ð½Ð½Ñ ÑайлÑ.readAsTextâ викоÑиÑÑовÑÑÑÑÑÑ Ð´Ð»Ñ ÑекÑÑÐ¾Ð²Ð¸Ñ ÑайлÑв, вмÑÑÑ Ð±Ñде запиÑано в ÑÑдок.readAsDataURLâ викоÑиÑÑовÑÑÑÑÑÑ, ÑкÑо ми Ñ Ð¾Ñемо викоÑиÑÑаÑи Ð´Ð°Ð½Ñ Ñк вмÑÑÑsrcÑегÑimgабо ÑнÑÐ¸Ñ . Ðожна ÑкоÑиÑÑаÑиÑÑ ÑнÑим ÑпоÑобом Ð´Ð»Ñ ÑÑого, Ñо опиÑано в ÑоздÑÐ»Ñ Blob:URL.createObjectURL(file).
ÐÑоÑÑгом зÑиÑÑÐ²Ð°Ð½Ð½Ñ ÑÐ°Ð¹Ð»Ñ Ð¼Ð¾Ð¶ÑÑÑ Ð²Ð¸Ð½Ð¸ÐºÐ½ÑÑи подÑÑ:
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 обâÑкÑÑв Ñ ÑнÑÑ ÑоÑмаÑи:
readAsArrayBuffer(blob)â вArrayBuffer,readAsText(blob, [encoding])â в ÑÑдок (алÑÑеÑнаÑивний ÑпоÑÑб доTextDecoder),readAsDataURL(blob)â в ÑоÑÐ¼Ð°Ñ base64-кодованого url.
FileReaderSync доÑÑÑпний вÑеÑÐµÐ´Ð¸Ð½Ñ Web WorkersÐÐ»Ñ Web Workers ÑÑнÑÑ FileReaderSync â ÑинÑ
Ñонний ваÑÑÐ°Ð½Ñ FileReader.
Ðого меÑод read* не ÑÑвоÑÑÑ Ð¿Ð¾Ð´Ñй, а пÑоÑÑо повеÑÑÐ°Ñ ÑезÑлÑÑаÑ, Ñк звиÑайна ÑÑнкÑÑÑ.
Ð¡Ð¸Ð½Ñ Ñонний меÑод бажано викоÑиÑÑовÑваÑи ÑÑлÑки вÑеÑÐµÐ´Ð¸Ð½Ñ Web Worker, бо заÑÑимки пÑд ÑÐ°Ñ ÑÐ¸Ð½Ñ Ñонного викликÑ, Ñо ймовÑÑÐ½Ñ Ð¿Ñи ÑÐ¸Ð½Ñ ÑÐ¾Ð½Ð½Ð¾Ð¼Ñ ÑиÑÐ°Ð½Ð½Ñ Ð· ÑайлÑв, в Web Worker Ñ Ð¼ÐµÐ½Ñ Ð²Ð°Ð¶Ð»Ð¸Ð²Ð¸Ð¼Ð¸. Ðони не впливаÑÑÑ Ð½Ð° ÑÑоÑÑнкÑ.
ÐÑдÑÑмки
File ÑÑпадковÑÑÑÑÑÑ Ð²Ñд Blob.
Ðа додаÑÑ Ð´Ð¾ меÑодÑв Ñа влаÑÑивоÑÑей, Ñо доÑÑÑÐ¿Ð½Ñ Ð² Blob, обâÑÐºÑ File Ð¼Ð°Ñ Ð²Ð»Ð°ÑÑивоÑÑÑ name, lastModified Ñа Ñе можливÑÑÑÑ ÑиÑаÑи Ñайли з ÑÐ°Ð¹Ð»Ð¾Ð²Ð¾Ñ ÑиÑÑеми. ÐеÑеважно обâÑÐºÑ File оÑÑимÑÑÑÑÑÑ Ð· коÑиÑÑÑваÑÑкого вводÑ, Ñк <input> Ñи DragânâDrop подÑÑми (ondragend).
FileReader обâÑÐºÑ Ð¼Ð¾Ð¶Ðµ пÑоÑиÑаÑи з ÑÐ°Ð¹Ð»Ñ Ñи blob в Ð¾Ð´Ð½Ð¾Ð¼Ñ Ð· ÑÑÑоÑ
ÑоÑмаÑÑв:
- Ð Ñдок (
readAsText). ArrayBuffer(readAsArrayBuffer).- URL в ÑоÑмаÑÑ base-64 (
readAsDataURL).
У багаÑÑоÑ
випадкаÑ
нам не поÑÑÑбно ÑиÑаÑи ÑвеÑÑ Ð²Ð¼ÑÑÑ ÑайлÑ. Так же Ñк Ñ Ð· blob, ми можемо ÑÑвоÑиÑи коÑоÑке поÑÐ¸Ð»Ð°Ð½Ð½Ñ Ð·Ð° Ð´Ð¾Ð¿Ð¾Ð¼Ð¾Ð³Ð¾Ñ URL.createObjectURL(file) Ñа пÑиÑвоÑÑи його ÑÐµÐ³Ñ <a> Ñи <img>. Таким Ñином Ñайл можна заванÑажиÑи Ñи показаÑи Ñк зобÑаженнÑ, Ñк ÑаÑÑÐ¸Ð½Ñ Ð²Ð¼ÑÑÑÑ canvas ÑоÑо.
Також легко вÑдпÑавиÑи File меÑежеÑ, бо меÑежеве API XMLHttpRequest Ñи fetch можÑÑÑ Ð±ÐµÐ·Ð¿Ð¾ÑеÑеднÑо пÑаÑÑваÑи з обâÑкÑами File.
ÐоменÑаÑÑ
<code>, Ð´Ð»Ñ ÐºÑлÑÐºÐ¾Ñ ÑÑдкÑв â обгоÑнÑÑÑ ÑÑ Ñегом<pre>, Ð´Ð»Ñ Ð¿Ð¾Ð½Ð°Ð´ 10 ÑÑдкÑв â викоÑиÑÑовÑйÑе пÑÑоÑниÑÑ (plnkr, jsbin, codepenâ¦)