教你如何使用?JavaScript?讀取文件
您可以使用 JavaScript File API 加載選定文件的內(nèi)容。本節(jié)介紹 File API 的基本用法。
現(xiàn)在讓我們看看如何使用 File API。
使用 JavaScript 讀取文件概述
選擇帶有輸入元素的文件
在 HTML 中,您可以通過將 input 元素的 type 屬性設(shè)置為 file 來選擇文件。
<input type="file">
如果您想允許多個(gè)文件選擇多設(shè)置屬性。
<input type="file" multiple>
用戶選擇文件后改變將發(fā)生一個(gè)事件。
處理輸入元素的變化事件
要捕獲更改事件,首先:改變有一種方法可以直接在其中編寫處理程序。您可以通過將其傳遞給 onchange 處理程序來立即在處理程序中訪問輸入元素,如下所示:
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>File Input Test</title> <script> function fileChanged(input) { console.log(input); for (let i = 0; i < input.files.length; i++) { console.log(input.files[i]); } } </script> </head> <body> <input type="file" onchange="fileChanged(this)" multiple/> </body> </html>
您還可以動(dòng)態(tài)獲取輸入元素來處理更改事件。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>File Input Test</title> <script> window.addEventListener('load', () => { const f = document.getElementById('file1'); f.addEventListener('change', evt => { const input = evt.target; for (let i = 0; i < input.files.length; i++) { console.log(input.files[i]); } }); }); </script> </head> <body> <input type="file" id="file1" multiple/> </body> </html>
在這種情況下,輸入元素被傳遞給事件對(duì)象的目標(biāo)屬性。
從輸入元素的 files 屬性中獲取一個(gè) File 對(duì)象
當(dāng)更改事件發(fā)生時(shí),輸入元素的 files 屬性將傳遞一個(gè) File 對(duì)象,該對(duì)象表示所選文件。
如果您顯示文件選擇屏幕一次并按下取消按鈕而不選擇文件,將調(diào)用更改事件處理程序,但文件屬性將是一個(gè)長(zhǎng)度為 0 的數(shù)組。
您可以將 File 對(duì)象保存在某處并稍后使用。
使用 FileReader 讀取 File 對(duì)象
您可以使用 FileReader 對(duì)象來讀取 File 對(duì)象的內(nèi)容。通過將 File 對(duì)象傳遞給 FileReader 對(duì)象的讀取文件的方法來開始讀取。
讀取文件的方法有以下幾種。
- readAsText()
- readAsArrayBuffer()
- readAsBinaryString()
- readAsDataURL()
FileReader 對(duì)象讀取 Blob 中的數(shù)據(jù)。File 對(duì)象也是一個(gè) Blob,因?yàn)樗菑?Blob 派生的。
當(dāng) FileReader 對(duì)象加載文件時(shí),會(huì)調(diào)用 onload 事件。讀取結(jié)果在 FileReader 對(duì)象的 result 屬性中設(shè)置。
讀取文本()讀取后,字符串設(shè)置在結(jié)果中,readAsArrayBuffer()讀取后,結(jié)果將設(shè)置為 ArrayBuffer 對(duì)象。
現(xiàn)在讓我們看看如何實(shí)際讀取文件。
讀取文件示例
讀取和顯示所選文件的示例
在這里,我們將制作一個(gè)行為如下的示例。
選擇文件后,將顯示所選文件的內(nèi)容。
顯示在此操作檢查中使用的 HTML 文件和樣式表的內(nèi)容。
HTML文件如下:請(qǐng)另存為file1.html。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8" /> <title>File API 1</title> <script src="file1.js"></script> <link href="style.css" rel="external nofollow" rel="stylesheet" /> </head> <body> <input type="file" id="file1" /> <pre id="pre1"></pre> </body> </html>
輸入元素的類型屬性文件作為,作為一個(gè)ID文件 1已設(shè)置。
樣式表樣式.css如下。我只是稍微改變了字體并添加了背景顏色,但我沒有做太多。
@import url('https://fonts.googleapis.com/css?family=Roboto&display=swap'); @import url('https://fonts.googleapis.com/css?family=Roboto+Mono&display=swap'); html { font-family: 'Roboto', sans-serif; } pre { font-family: 'Roboto mono', monospace; font-size: 0.9rem; background-color: #D6EAF8; padding: 10px; }
JavaScript 文件file1.js如下。
window.addEventListener('load', () => { const f = document.getElementById('file1'); f.addEventListener('change', evt => { let input = evt.target; if (input.files.length == 0) { console.log('No file selected'); return; } const file = input.files[0]; const reader = new FileReader(); reader.onload = () => { const pre = document.getElementById('pre1'); pre.innerHTML = reader.result; }; reader.readAsText(file); }); });
在窗口對(duì)象的加載事件處理程序中,設(shè)置了該文件輸入元素的更改事件處理程序。
當(dāng)您進(jìn)行文件選擇操作時(shí),這將調(diào)用更改事件處理程序。
一個(gè) Event 對(duì)象被傳遞給事件處理程序。執(zhí)行文件選擇操作的輸入元素被傳遞給事件對(duì)象的目標(biāo)屬性。這個(gè)輸入元素文件該屬性設(shè)置為選定文件對(duì)象的列表。
這次我們沒有在 input 元素上設(shè)置 multiple 屬性,所以只會(huì)設(shè)置一個(gè) File 對(duì)象。
拿到File對(duì)象后,接下來就是讀取文件的地方了。
const file = input.files[0]; const reader = new FileReader(); reader.onload = () => { const pre = document.getElementById('pre1'); pre.innerHTML = reader.result; }; reader.readAsText(file);
這樣,預(yù)文件的內(nèi)容在元素中設(shè)置。
Promise 的事件處理和使用
好吧,在上面的代碼中文件閱讀器對(duì)象的 讀取文本()在調(diào)用方法之前負(fù)載我已經(jīng)設(shè)置了一個(gè)事件處理程序。
文件閱讀器還有更多可用的事件,但每次設(shè)置它們?nèi)缓笳{(diào)用它們可能有點(diǎn)復(fù)雜。
所以讓我們使用 Promises 來組織我們的代碼。
準(zhǔn)備一個(gè)接收File對(duì)象的函數(shù)對(duì)象,如:
const readAsTextReader = file => { const reader = new FileReader(); return new Promise((resolve, reject) => { reader.onloadstart = ev => { console.log(`onloadstart: total=${ev.loaded}/${ev.loaded}`); }; reader.onloadend = ev => { console.log(`onloadend: total=${ev.loaded}/${ev.loaded}`); }; reader.onprogress = ev => { console.log(`onprogress: total=${ev.loaded}/${ev.loaded}`); }; reader.onerror = () => { reader.abort(); reject('Unknown error occurred during reading the file'); }; reader.onload = () => { console.log('onload'); resolve(reader.result); }; reader.readAsText(file); }); };
這樣,讀取文件時(shí)的異步處理使用 Promise 的 then 和 catch,應(yīng)用如下。
window.addEventListener('load', () => { const f = document.getElementById('file1'); f.addEventListener('change', evt => { const input = evt.target; if (input.files.length == 0) { return; } const file = input.files[0]; console.log(file); readAsTextReader(file) .then(value => { const pre = document.getElementById('pre1'); pre.innerHTML = value; }) .catch(reason => { alert(reason); }); }); });
簡(jiǎn)單的二進(jìn)制文件查看器
接下來,讓我們創(chuàng)建一個(gè)簡(jiǎn)單的二進(jìn)制文件查看器作為示例,不僅可以讀取文本文件,還可以讀取二進(jìn)制文件。
選擇文件并使用 FileReader 讀取文件的位置是相同的。
然而,這一次readAsArrayBuffer()讀取文件。結(jié)果作為 ArrayBuffer 返回。
ArrayBuffer 是 JavaScript 中的字節(jié)字符串。有關(guān)詳細(xì)信息,請(qǐng)參閱“使用 ArrayBuffer 處理二進(jìn)制數(shù)據(jù)”。
const readAsArrayBufferReader = file => { const reader = new FileReader(); return new Promise((resolve, reject) => { reader.onerror = () => { reader.abort(); reject('Unknown error occurred during reading the file'); }; reader.onload = () => { console.log('onload'); resolve(reader.result); }; reader.readAsArrayBuffer(file); }); }; window.addEventListener('load', () => { const f = document.getElementById('file1'); f.addEventListener('change', evt => { const input = evt.target; if (input.files.length == 0) { return; } let file = input.files[0]; console.log(file); if (!file) { return; } if (file.size > 50 * 1024) { alert('Please select a file smaller than 50kb.'); return; } readAsArrayBufferReader(file) .then(buff => { console.log(buff); let s = ''; let a = new Uint8Array(buff); for (let i = 0; i * 16 < a.length; i++) { let line = ''; let p = i * 16; let b = a.slice(p, Math.min(a.length, p + 16)); for (const e of b) { let h = e .toString(16) .toUpperCase() .padStart(2, '0'); line += ' ' + h; } let addr = p .toString(16) .toUpperCase() .padStart(8, '0'); line = `${addr}:${line}\n`; s += line; } let pre = document.getElementById('pre1'); pre.innerHTML = s; }) .catch(reason => { alert(reason); }); }); });
這次文件大小限制為 50KB。
從讀取為 ArrayBuffer 的數(shù)據(jù)創(chuàng)建一個(gè) Uint8Array 對(duì)象。從那里片()格式化為以 16 字節(jié)為增量顯示。
到目前為止,我們已經(jīng)介紹了如何在 JavaScript 中使用 File 對(duì)象和 FileReader 讀取文件,如何使用 Promise 簡(jiǎn)化異步處理,以及處理二進(jìn)制數(shù)據(jù)的示例。
到此這篇關(guān)于如何使用 JavaScript 讀取文件的文章就介紹到這了,更多相關(guān)js讀取文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
JavaScript實(shí)現(xiàn)前端分頁(yè)控件
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)前端分頁(yè)控件的相關(guān)代碼,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-04-04簡(jiǎn)單實(shí)現(xiàn)JS倒計(jì)時(shí)效果
這篇文章主要教大家如何簡(jiǎn)單實(shí)現(xiàn)JS倒計(jì)時(shí)效果,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12將兩個(gè)div左右并列顯示并實(shí)現(xiàn)點(diǎn)擊標(biāo)題切換內(nèi)容
將兩個(gè)div左右并列顯示并實(shí)現(xiàn)點(diǎn)擊標(biāo)題切換內(nèi)容的效果,接下來為大家詳細(xì)介紹下js中時(shí)如何實(shí)現(xiàn)的,感興趣的朋友不要錯(cuò)過2013-10-10淺談javascript的call()、apply()、bind()的用法
這篇文章主要為大家詳細(xì)介紹了javascript的call()、apply()、bind()的用法,探討JavaScript中函數(shù)的一些特殊用法,感興趣的小伙伴們可以參考一下2016-02-02一個(gè)檢測(cè)表單數(shù)據(jù)的JavaScript實(shí)例
這篇文章主要介紹了一個(gè)檢測(cè)表單數(shù)據(jù)的JavaScript實(shí)例,很簡(jiǎn)單,很實(shí)用,比較適合初學(xué)者2014-10-10JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器
這篇文章主要為大家詳細(xì)介紹了JavaScript實(shí)現(xiàn)隨機(jī)點(diǎn)名器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03