<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
FileReader是一種非同步檔案讀取機制,結合input:file可以很方便的讀取本地檔案。
在介紹FileReader之前,先簡單介紹input的file型別。
<input type="file" id="file">
input的file型別會渲染為一個按鈕和一段文字。點選按鈕可開啟檔案選擇視窗,文字表示對檔案的描述(大部分情況下為檔名);file型別的input會有files屬性,儲存著檔案的相關資訊。
document.querySelector('#file').addEventListener('change',(fileChoosed) => { console.log('fileChoosed', fileChoosed.target.files) })
點選按鈕上傳一個檔案後,在控制檯列印上傳的檔案資訊,如下:
可以發現檔案資訊是一個json物件,由傳入的file物件組成。每個file物件(即每個上傳檔案)包含以下屬性:
lastModified:數值,表示最近一次修改時間的毫秒數;
lastModifiedDate:物件,表示最近一次修改時間的Date物件;
name:本地檔案系統中的檔名;
size:檔案的位元組大小;
type:字串,檔案的MIME型別;
webkitRelativePath:此處為空;當在input上加上webkitdirectory屬性時,使用者可選擇資料夾,此時webkitRelativePath表示資料夾中檔案的相對路徑。
<input type="file" id="file" webkitdirectory>
以上file物件只獲取到了對檔案的描述資訊,但沒有獲得檔案中的資料。我們可以通過html5提供的FileReader讀取到檔案中的資料。
首先建立一個FileReader範例:
const reader = new FileReader();
FileReader提供瞭如下方法:
readAsArrayBuffer(file)
按位元組讀取檔案內容,結果用ArrayBuffer物件表示
readAsBinaryString(file)
按位元組讀取檔案內容,結果為檔案的二進位制串
readAsDataURL(file)
讀取檔案內容,結果用data:url的字串形式表示
readAsText(file,encoding)
按字元讀取檔案內容,結果用字串形式表示
abort()
終止檔案讀取操作
readAsDataURL和readAsText較為常用,這裡只對這兩者進行說明。
readAsDataURL會將檔案內容進行base64編碼後輸出:
document.querySelector('#file').addEventListener('change',(fileChoosed) => { const reader = new FileReader(); reader.readAsDataURL(fileChoosed.target.files[0]);//發起非同步請求 reader.onload = function(readRes){ console.log('載入完成', readRes.target.result) } })
控制檯為當前所傳檔案的base64編碼表示。由於媒體檔案的src屬性,可以通過採用網路地址或base64的方式顯示,因此我們可以利用readAsDataURL實現對圖片的預覽。
如下,只需將讀取的結果賦給圖片的src屬性,即可預覽圖片:
<input type="file" id="file" /> <img src="" id="imgPreview">
document.querySelector('#file').addEventListener('change',(fileChoosed) => { const reader = new FileReader(); reader.readAsDataURL(fileChoosed.target.files[0]);//發起非同步請求 reader.onload = function(readRes){ document.querySelector('#imgPreview').src = readRes.target.result } })
readAsText可按指定編碼方式讀取檔案,但讀取檔案的單位是字元,故對於文字檔案,只要按規定的編碼方式讀取即可;而對於媒體檔案(圖片、音訊、視訊),其內部組成並不是按字元排列,故採用readAsText讀取,會產生亂碼。
FileReader事件:
註釋:
範例:
<input type="file" id="file" />
document.querySelector('#file').addEventListener('change',(fileChoosed) => { const reader = new FileReader(); reader.readAsText(fileChoosed.target.files[0],'utf-8');//發起非同步請求 reader.onloadstart = function(readRes){ // 檔案大於500kb則取消載入 if(readRes.total > 1024*500) { reader.abort() } else { console.log("開始載入") } } reader.onabort = function (readRes) { console.log('載入已取消') } reader.onprogress = function(readRes){ console.log("載入中", `${(readRes.loaded / readRes.total).toFixed(2)*100}/100`) }
實現的功能:
包含的知識點:
為了方便觀看, 這裡也把程式碼帖上:
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>FileReader Learning</title> </head> <body> <div class="container"> <form novalidate> <div class="avatars-row" style="margin: 10px;"> <label>選擇檔案: <input type="file" name="avatars" id="attachment" accept="*/*" multiple></input> </label> </div> <div class="result" id="result" style="overflow: auto; border: 1px solid cyan; height: 300px;"></div> </form> </div> <script> (function (window, doc, undefined) { function $(id) { return doc.getElementById(id); } let App = { createFileReader: () => { if (typeof FileReader === "undefined") { throw new Error("FileReader is not avaliable"); } return new FileReader(); }, /** * @return FileList */ getFiles: () => { var attachment = $("attachment"), files = attachment.files; return files || new Error("no file uploaded"); }, /** * 統一的讀取介面 */ read: function(api, file, callback) { let self = this; return new Promise((resolve, reject) => { let reader = self.createFileReader(); reader.onload = e => { resolve(e.target.result); }; reader.onerror = e => { reject("read error"); }; reader.onabort = e => { reject("abort error"); }; // size <= 1M if (file && file.size > 1 * 1024 * 1024) { reject('file is too large'); return; } reader[api](file); }); }, onFileChange: function(callback) { let self = this; $("attachment").onchange = function (e) { callback(self.getFiles()); }; }, onDrop: function() { let self = this; let resultContainer = $('result'); document.ondragover = e => { e.preventDefault(); }; document.ondrop = e => { e.preventDefault(); }; resultContainer.ondragend = e => { e.preventDefault(); }; resultContainer.ondrop = e => { e.preventDefault(); let files = e.dataTransfer.files; self.handleAll(files); }; }, handleFiles: function(files) { let self = this; let p; let ret = []; // FileList轉陣列 [].slice.call(files).forEach(function(file, i) { const type = file.type; switch (true) { case /text/w+/.test(type): p = self.read("readAsText", file); break; case /image/w+/.test(type): p = self.read("readAsDataURL", file); break; default: p = self.read("readAsBinaryString", file); break; } ret.push(p); }); return ret; }, init: function() { var self = this; self.onDrop(); // 這裡的onFileChange不能寫成Promise, 不然只會第一次有效, 因為狀態已經是fulfilled了 self.onFileChange(files => { self.handleAll(files); }); }, handleAll: function(files) { let self = this; Promise.all(self.handleFiles(files)) .then(results => { self.showResults(results); }) .catch(err => { console.log(err); }); }, showResults: results => { console.log(results); let resultContainer = $("result"); results.forEach((result, i) => { // alert(3); switch (true) { case result.indexOf("data:image/") >= 0: resultContainer.innerHTML += `<div><img src="${result}"></div>`; break; default: resultContainer.innerHTML += `<p>${result}<p>`; break; } }); } }; App.init(); })(window, document); </script> </body> </html>
到此這篇關於JavaScript中FileReader的文章就介紹到這了,更多相關js中的FileReader內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45