做者: Martin Splitt
譯者:前端小智
來源:dev
點贊再看,養成習慣本文
GitHub
https://github.com/qq44924588... 上已經收錄,更多往期高贊文章的分類,也整理了不少個人文檔,和教程資料。歡迎Star和完善,你們面試能夠參照考點複習,但願咱們一塊兒有點東西。javascript
出於安全和隱私的緣由,web應用程序不能直接訪問用戶設備上的文件。若是須要讀取一個或多個本地文件,能夠經過使用input file
和FileReader
來實現。在這篇文章中,咱們將經過一些例子來看看它是如何工做的。前端
因爲瀏覽器中的 JS 沒法從用戶的設備訪問本地文件,咱們須要爲用戶提供一種方法來選擇一個或多個文件供咱們使用。這能夠經過文件選擇器<input type='fule' />
來完成。java
<input type="file" id="fileInput">
若是想允選擇多個文件,能夠添加multiple
屬性:git
<input type="file" id="fileInput" multiple>
咱們能夠經過change
事件來監聽文件的選擇,也能夠添加另外一個UI元素讓用戶顯式地開始對所選文件的處理。github
input file 具備一個files
屬性,該屬性是File
對象的列表(可能有多個選擇的文件)。web
<input type="file" id="fileInput"> <script> document.getElementById('fileInput').addEventListener('change', function selectedFileChanged() { console.log(this.files); // will contain information about the file that was selected. }); </script>
File
對象以下所示:面試
{ name: 'test.txt', // 所選文件的名稱 size: 1024, // 字節大小 type: 'text/plain', // 基於文件擴展名的假定文件類型,這有多是不正確的 lastModified: 1234567890, // 根據用戶系統的最新更改的時間戳 lastModifiedDate: // 最後修改的時間戳的日期對象 }
讀取文件,主要使用的是FileReader類。瀏覽器
該對象擁有的屬性:安全
FileReader.error :只讀,一個DOMException
,表示在讀取文件時發生的錯誤 。微信
FileReader.readyState:只讀 表示FileReader狀態的數字。取值以下:
常量名 | 值 | 描述 |
---|---|---|
EMPTY | 0 | 尚未加載任何數據 |
LOADING | 1 | 數據正在被加載 |
DONE | 2 | 已完成所有的讀取請求 |
FileReader.result:只讀,文件的內容。該屬性僅在讀取操做完成後纔有效,數據的格式取決於使用哪一個方法來啓動讀取操做。
該對象擁有的方法:
readAsText(file, encoding)
:以純文本形式讀取文件,讀取到的文本保存在result
屬性中。第二個參數表明編碼格式。
readAsDataUrl(file)
:讀取文件而且將文件以數據URI
的形式保存在result
屬性中。
readAsBinaryString(file)
:讀取文件而且把文件以字符串保存在result
屬性中。
readAsArrayBuffer(file)
:讀取文件而且將一個包含文件內容的ArrayBuffer
保存咋result
屬性中。
FileReader.abort()
:停止讀取操做。在返回時,readyState
屬性爲DONE
。
文件讀取的過程是異步操做,在這個過程當中提供了三個事件:progress
、error
、load
事件。
progress
:每隔50ms
左右,會觸發一次progress
事件。
error
:在沒法讀取到文件信息的條件下觸發。
load
:在成功加載後就會觸發。
在下面的示例中,咱們將使用readAsText
和readAsDataURL
方法來顯示文本和圖像文件的內容。
爲了將文件內容顯示爲文本,change
須要重寫一下:
document.getElementById('fileInput').addEventListener('change', function selectedFileChanged() { if (this.files.length === 0) { console.log('請選擇文件!'); return; } const reader = new FileReader(); reader.onload = function fileReadCompleted() { // 當讀取完成時,內容只在`reader.result`中 console.log(reader.result); }; reader.readAsText(this.files[0]); });
首先,咱們要確保有一個能夠讀取的文件。若是用戶取消或以其餘方式關閉文件選擇對話框而不選擇文件,咱們就沒有什麼要讀取和退出函數。
而後咱們繼續建立一個FileReader
。reader
的工做是異步的,以免阻塞主線程和UI更新,這在讀取大文件(如視頻)時很是重要。
reader
發出一個'load'
事件(例如,相似於Image
對象),告訴咱們的文件已經讀取完畢。
reader
將文件內容保存在其result
屬性中。此屬性中的數據取決於咱們使用的讀取文件的方法。在咱們的示例中,咱們使用readAsText
方法讀取文件,所以result
將是一個文本字符串。
若是咱們想要顯示圖像,將文件讀取爲字符串並非頗有用。FileReader
有一個readAsDataURL
方法,能夠將文件讀入一個編碼的字符串,該字符串能夠用做<img>
元素的源。本例的代碼與前面的代碼基本相同,區別是咱們使用readAsDataURL
讀取文件並將結果顯示爲圖像:
document.getElementById('fileInput').addEventListener('change', function selectedFileChanged() { if (this.files.length === 0) { console.log('No file selected.'); return; } const reader = new FileReader(); reader.onload = function fileReadCompleted() { const img = new Image(); img.src = reader.result; document.body.appendChild(img); }; reader.readAsDataURL(this.files[0]); });
1)因爲安全和隱私的緣由,JavaScript 不能直接訪問本地文件。
2)能夠經過 input 類型爲 file 來選擇文件,並對文件進行處理。
3) file
input 具備帶有所選文件的files
屬性。
4) 咱們可使用FileReader
來訪問所選文件的內容。
代碼部署後可能存在的BUG無法實時知道,過後爲了解決這些BUG,花了大量的時間進行log 調試,這邊順便給你們推薦一個好用的BUG監控工具 Fundebug。
原文:https://dev.to/g33konaut/read...
文章每週持續更新,能夠微信搜索「 大遷世界 」第一時間閱讀和催更(比博客早一到兩篇喲),本文 GitHub https://github.com/qq449245884/xiaozhi 已經收錄,整理了不少個人文檔,歡迎Star和完善,你們面試能夠參照考點複習,另外關注公衆號,後臺回覆福利,便可看到福利,你懂的。