JS前端文件讀取FileReader操作方法總結
FileReader
FileReader 是一個對象,允許 Web 應用程序異步讀取存儲在用戶計算機上的文件(或原始數據緩沖區(qū))的內容,使用 File 或 Blob 對象指定要讀取的文件或數據。
構造函數:
let reader = new FileReader(); // 沒有參數
主要方法
readAsArrayBuffer(blob)
將數據讀取為二進制格式的 ArrayBuffer。當讀取操作完成時,readyState 變成 DONE(已完成),并觸發(fā) loadend 事件,同時 result 屬性中將包含一個 ArrayBuffer 對象以表示所讀取文件的數據。
reader.readAsArrayBuffer(blob)
readAsText(blob, [encoding])
將數據讀取為給定編碼(默認為 utf-8 編碼)的文本字符串。
instanceOfFileReader.readAsText(blob[, encoding]);
readAsDataURL(blob)
讀取二進制數據,并將其編碼為 base64 的 data url。
reader.readAsDataURL(blob);
讀取方法都是異步的,也就是說只有當執(zhí)行完成后才能夠查看到結果,如果直接查看是無結果的,并返回 undefined。必須要掛載 實例下的 onload 或 onloadend 的方法才能處理轉化后的結果
FileReader的三個屬性:
- error: 返回讀取時的錯誤信息
- readyState: 返回操作的當前狀態(tài)
- result: 返回讀取文件的結果
讀取文件的示例:
參考 http://www.dbjr.com.cn/javascript/3249569x8.htm
<input type="file" onchange="readFile(this)"> <script> function readFile(input) { let file = input.files[0]; let fileReader= new FileReader(); fileReader.readAsText(file); // 或者 fileReader.readAsArrayBuffer(file) /** * 該方法在讀取時調用 */ fileReader.onloadstart = () => { console.log("開始讀取") console.log(fileReader.readyState)//調用函數,但還沒有結束,返回1 } /** * 該方法在讀取成功時調用 */ fileReader.onload = () => { console.log("讀取成功") console.log(fileReader.result) console.log(fileReader.readyState)//調用完成,返回2 } /** * 該方法在讀取結束時調用 */ fileReader.onloadend = () => { console.log("讀取結束") } /** * 讀取過程中觸發(fā) */ fileReader.onprogress = (e) => { console.log("讀取中") //獲取已經加載的數據量 console.log("loaded==>" + e.loaded) } /** * 該方法在調用abort函數時觸發(fā) */ fileReader.onabort = () => { console.log("操作終止") } //當讀取出現失敗時觸發(fā) fileReader.onerror = () => { console.log("出現錯誤") console.log(fileReader.error) } } </script>
read 方法的選擇tips:
readAsArrayBuffer
—— 用于二進制文件,執(zhí)行低級別的二進制操作。對于諸如切片(slicing)之類的高級別的操作,File 是繼承自 Blob 的,所以可以直接調用它們,而無需讀取。readAsText
—— 用于文本文件,當我們想要獲取字符串時。readAsDataURL
—— 用于在 src 中使用此數據,并將其用于img
或其他標簽時。還有一種用于此的讀取文件的替代方案:
URL.createObjectURL(file)
。
示例:根據用戶傳入的圖片文件,來生成一個對應的臨時url,并將臨時url作為src傳給img標簽
<input type="file" id="file"> <img id="img"> let file = document.getElementById("file") let img= document.getElementById("img") file.addEventListener("change", (e) => { let fileList=e.target.files //先獲取一份文件 //這里獲取的才是File對象 let file = fileList[0] //因為file也是Blob對象,所以直接傳入即可 img.src=URL.createObjectURL(file) })
主要事件
讀取過程中,有以下事件:
- loadstart —— 開始加載。
- progress —— 在讀取過程中出現,當FileReader讀取數據時,進度事件會定期觸發(fā)。
- load —— 讀取完成時觸發(fā),沒有 error。
- abort —— 在中止讀取時會觸發(fā) abort 事件:例如程序調用 abort()。。
- error —— 出現 error時觸發(fā)。
- loadend —— 讀取完成,無論成功還是失敗。
讀取完成后,可以通過以下方式訪問讀取結果:
- reader.result 是結果(如果成功)
- reader.error 是 error(如果失敗)。
檢測瀏覽器對 FileReader 的支持:
if(window.FileReader) { var fr = new FileReader(); // add your code here }else { alert("Not supported by your browser!"); }
React + antd Upload 組件示例
場景: 表單文件上傳,讀取后以base64格式與表單一起傳給后端。
<Upload maxCount={1} accept=".jpg,.jpeg,.png" beforeUpload={(file) => { console.log('文件類型', file.type, file); // 限制文件類型 const allowTypes = [ 'image/png', 'image/jpeg', 'image/jpg', ]; const isAllowType = allowTypes.includes(file.type); // 校驗文件大小和類型 if (!isAllowType || file.size / 1024 / 1024 > 4) { message.error('文件格式大小錯誤'); return Upload.LIST_IGNORE; } const reader = new FileReader(); //將上傳的文件讀取成base64 reader.readAsDataURL(file); reader.onloadend = function () { console.log('文件Base64內容',reader.result, file); }; // 阻止上傳,為了最后和表單一起提交 return false; }} > <Button icon={<UploadOutlined />} type="primary"> 文件上傳 </Button> </Upload>
總結
到此這篇關于JS前端文件讀取FileReader操作方法總結的文章就介紹到這了,更多相關JS前端文件讀取FileReader內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!