摘要:如果二進(jìn)制大對象引用處于非可讀狀態(tài)在上下文對象上設(shè)置錯誤屬性,用來返回,并且觸發(fā)一個事件,在上下文對象中調(diào)用錯誤,終止流程。當(dāng)該方法被調(diào)用,用戶代理將會執(zhí)行以下過程如果狀態(tài)為,拋出非法狀態(tài)錯誤異常,并終止流程。
FileReader API
FileReader api為用戶提供了方法去讀取一個文件或者一個二進(jìn)制大對象,并且提供了事件模型讓用戶可以操作讀取后的結(jié)果。
接口// window, worker中可用 [Constructor, Exposed=Window,Worker] // 實現(xiàn)EventTarget的FileReader接口聲明 interface FileReader: EventTarget { // 異步的讀取方法 // 直接讀取二進(jìn)制大對象為ArrayBuffer類型 void readAsArrayBuffer(Blob blob); // 讀取為文本,第二個參數(shù)可指定編碼類型 void readAsText(Blob blob, optional DOMString label); // 讀取為base64格式 void readAsDataURL(Blob blob); // 中斷讀取 void abort(); // 狀態(tài)常量 // 還沒有加載任何數(shù)據(jù) const unsigned short EMPTY = 0; // 數(shù)據(jù)正在加載中 const unsigned short LOADING = 1; // 已完成全部的讀取請求 const unsigned short DONE = 2; // 只讀,獲取常量中的某一個狀態(tài) readonly attribute unsigned short readyState; // 返回文件結(jié)果,只讀的,只有在讀取結(jié)束后才有效 // 數(shù)據(jù)的格式取決于讀取操作是由哪個方法發(fā)起的 readonly attribute (DOMString or ArrayBuffer)? result; // 如果讀取時發(fā)生錯誤,只讀的 readonly attribute DOMError? error; // 事件方法屬性 // 當(dāng)讀取開始時的事件 attribute EventHandler onloadstart; // 當(dāng)進(jìn)行時的事件 attribute EventHandler onprogress; // 當(dāng)讀取時的事件 attribute EventHandler onload; // 當(dāng)取消時的事件 attribute EventHandler onabort; // 當(dāng)錯誤時的事件 attribute EventHandler onerror; // 當(dāng)讀取完成的事件 attribute EventHandler onloadend; };構(gòu)造器
當(dāng)FileReader構(gòu)造器被調(diào)用的時候,用戶代理必須返回一個新的FileReader對象。該構(gòu)造器必須在Window 或者 WorkerGlobalScope 環(huán)境下可用.
事件處理屬性下列的內(nèi)容是事件處理屬性和他們的事件處理類型:
事件處理屬性 | 事件處理類型 |
onloadstart | loadstart |
onprogress | progress |
onabort | abort |
onerror | error |
onload | load |
onloadend | loadend |
FileReader對象有三種狀態(tài),在readyState屬性中,當(dāng)觸發(fā)getting訪問操作,必然會返回一個FileReader的當(dāng)前狀態(tài),而他的值必然是下面三個中的其中一個:
EMPTY (數(shù)字值為 0)
當(dāng)FileReader對象唄創(chuàng)建的時候,是不存在pending讀取狀態(tài)的,因為此時沒有任何讀取方法被調(diào)用。這個空狀態(tài)是創(chuàng)建FileReader時候的初始狀態(tài),直到某個讀取方法被調(diào)用。
LOADING (數(shù)字值為 1)
當(dāng)一個文件或者二進(jìn)制大對象正在被讀取,某一個讀取方法正在進(jìn)行的時候,并且沒有錯誤發(fā)生的時候,狀態(tài)為loading
DONE (數(shù)字值為2)
當(dāng)文件對象或者二進(jìn)制大對象被讀入內(nèi)存的時候,或者發(fā)生一個讀取錯誤的時候,或者用戶調(diào)用了abort()操作的時候,這個時候,F(xiàn)ileReader不再進(jìn)行讀取,如果狀態(tài)被設(shè)置為了完成,這意味著某一個讀取方法被調(diào)用過了讀取一個文件或者二進(jìn)制大對象(Blob)
FileReader接口有三個異步讀取方法,readAsArrayBuffer, readAsText, and readAsDataURL,他們可以把文件讀入內(nèi)存,如果多個讀取方法同時被調(diào)用(一個FileReader對象上),用戶代理必須在任何讀取進(jìn)行中的時候拋出一個非法狀態(tài)錯誤
result屬性當(dāng)訪問result屬性,該屬性將會返回一個原始二進(jìn)制數(shù)據(jù)或者一個ArrayBuffer對象或者null以表示所讀取文件的內(nèi)容.
當(dāng)訪問該屬性的時候,如果準(zhǔn)備狀態(tài)為EMPTY,你將得到一個null結(jié)果
當(dāng)訪問該屬性的時候,如果讀取過程中發(fā)生了錯誤,你將得到一個null結(jié)果
當(dāng)訪問該屬性的時候,如果是使用了readAsBataURL讀取方法,result屬性必然會返回一個DataURL編碼的字符串
當(dāng)訪問該屬性的時候,如果readAsText讀取方法被調(diào)用,并且沒發(fā)生錯誤,該屬性將返回指定編碼的文檔字符串。
當(dāng)訪問該屬性的時候,如果readAsArrayBuffer方法被調(diào)用,并且中間沒有錯誤發(fā)生,該屬性將返回一個ArrayBuffer對象
readAsDataURL(blob) 方法當(dāng)調(diào)用該方法,用戶代理將會執(zhí)行以下步驟
如果狀態(tài)為loading,拋出非法狀態(tài)錯誤異常,并終止流程。
如果二進(jìn)制大對象引用處于非可讀狀態(tài)( CLOSED readability state),在上下文對象上設(shè)置錯誤屬性,用來返回 InvalidStateError DOMError,并且觸發(fā)一個error事件,在上下文對象中調(diào)用錯誤,終止流程。
如果沒事,就將讀取狀態(tài)設(shè)置為LOADING。
初始化一個帶注解的讀取任務(wù),將blob參數(shù)作為輸入并且處理在下述file reading task source上的任務(wù)隊列
處理讀取錯誤,如果開始讀取就失敗,流程將進(jìn)入錯誤觸發(fā)流程
處理讀取并且觸發(fā)loadstart事件
處理讀取到的數(shù)據(jù),觸發(fā)progress事件
處理讀取到結(jié)束符(EOF),執(zhí)行以下步驟:
設(shè)置readyState為DONE
設(shè)置result屬性內(nèi)容為讀操作的DataURL結(jié)果,當(dāng)訪問該屬性的時候,將二進(jìn)制對象數(shù)據(jù)以DataURL形式返回
觸發(fā)load事件
直到readyState不是loading狀態(tài),觸發(fā)loadend事件
結(jié)束流程
readAsText(blob, label) 方法該方法接受一個額外的可選參數(shù)label,他是一個字符串,表明讀取成的文檔應(yīng)該以何種形式編碼,如果提供了該參數(shù),當(dāng)在調(diào)用該方法過程中,將會以該種編碼形式編碼讀取到的文檔。
當(dāng)該方法被調(diào)用,用戶代理將會執(zhí)行以下過程:
如果readyState狀態(tài)為loading,拋出非法狀態(tài)錯誤異常,并終止流程。
如果二進(jìn)制大對象引用處于非可讀狀態(tài)( CLOSED readability state),在上下文對象上設(shè)置錯誤屬性,用來返回 InvalidStateError DOMError,并且觸發(fā)一個error事件,在上下文對象中調(diào)用錯誤,終止流程。
如果沒事,就將讀取狀態(tài)設(shè)置為LOADING。
初始化一個帶注解的讀取任務(wù),將blob參數(shù)作為輸入并且處理在下述file reading task source上的任務(wù)隊列
處理讀取錯誤,如果開始讀取就失敗,流程將進(jìn)入錯誤觸發(fā)流程
處理讀取并且觸發(fā)loadstart事件
處理讀取到的數(shù)據(jù),觸發(fā)progress事件
處理讀取到結(jié)束符(EOF),執(zhí)行以下步驟:
設(shè)置readyState為DONE
設(shè)置result屬性內(nèi)容為讀操作的結(jié)果,當(dāng)訪問該屬性的時候,將數(shù)據(jù)以規(guī)定編碼形式編碼后返回
觸發(fā)load事件
直到readyState不是loading狀態(tài),觸發(fā)loadend事件
結(jié)束流程
readAsArrayBuffer(blob) 方法當(dāng)該方法被調(diào)用,用戶代理執(zhí)行以下步驟:
如果readyState狀態(tài)為loading,拋出非法狀態(tài)錯誤異常,并終止流程。
如果二進(jìn)制大對象引用處于非可讀狀態(tài)( CLOSED readability state),在上下文對象上設(shè)置錯誤屬性,用來返回 InvalidStateError DOMError,并且觸發(fā)一個error事件,在上下文對象中調(diào)用錯誤,終止流程。
如果沒事,就將讀取狀態(tài)設(shè)置為LOADING。
初始化一個帶注解的讀取任務(wù),將blob參數(shù)作為輸入并且處理在下述file reading task source上的任務(wù)隊列
處理讀取錯誤,如果開始讀取就失敗,流程將進(jìn)入錯誤觸發(fā)流程
處理讀取并且觸發(fā)loadstart事件
處理讀取到的數(shù)據(jù),觸發(fā)progress事件
處理讀取到結(jié)束符(EOF),執(zhí)行以下步驟:
設(shè)置readyState為DONE
設(shè)置result屬性內(nèi)容為讀操作的結(jié)果,當(dāng)訪問該屬性的時候,將數(shù)據(jù)以ArrayBuffer對象的形式返回
觸發(fā)load事件
直到readyState不是loading狀態(tài),觸發(fā)loadend事件
結(jié)束流程
錯誤處理步驟首先,這些錯誤步驟是用于處理讀取過程中獲得失敗原因的。
設(shè)置上下文中的readyState為DONE狀態(tài),然后將result置null
設(shè)置上下文中的error屬性,當(dāng)我們訪問ctx.error的時候,值返回一個DOMError對象,該對象記錄了失敗原因。觸發(fā)error事件。
直到readyState不是loading狀態(tài),觸發(fā)loadend事件
流程終止并終止任何正在進(jìn)行的讀方法
abort() 方法當(dāng)調(diào)用該方法,用戶代理做以下事情:
如果readyState = EMPTY或者 readyState = DONE, 設(shè)置result為null,終止流程
如果狀態(tài)為LOADING,設(shè)置狀態(tài)為DONE,設(shè)置result為null,
如果下述讀取任務(wù)在任務(wù)隊列中,從隊列中移除這些任務(wù)
終止正在執(zhí)行的讀取方法,終止其處理流程
觸發(fā)abort事件
觸發(fā)loadend事件
blob參數(shù)FileReader上有三個異步方法,F(xiàn)ileReaderSync有三個同步方法,URL對象上有createObjectURL,createFor兩個靜態(tài)方法,他們都接受一個叫做blob的參數(shù),這一章節(jié)將闡述該參數(shù)的定義
blob
這個形式參數(shù)是指調(diào)用時的一個二進(jìn)制大對象的實參,并且他必然是一個非底層文件系統(tǒng)拿到的File/Filelist/Blob對象的引用
聲明編碼當(dāng)我們通過readAsText(bolb, label)方法讀取blob對象的時候,必須遵循:
使 encoding 為 null
如果提供了label參數(shù),設(shè)置encoding = label,這個label字符串必須符合現(xiàn)行編碼標(biāo)準(zhǔn)所規(guī)定的各種編碼類型
如果"獲取編碼"(2這一步)這一步驟返回失敗,設(shè)置encoding為null
如果encoding為null,并且blob對象提供了type屬性,并且限定了一個字符集參數(shù)(例如 text/plain;charset=UTF-8),然后該步驟會取此限定參數(shù)作為encoding。
如果上一步失敗,設(shè)置encoding = null
如果encoding = null, 設(shè)置encoding = "utf-8"
獲取對blob的編碼結(jié)果
事件FileReader對象就是自己所接受事件的event target。。。因為從第一章節(jié)我們知道這個FileReader API是繼承自 EventTarget的。。。。
當(dāng)按照規(guī)范說明觸發(fā)某個進(jìn)度事件(onload什么的,event對象的構(gòu)造函數(shù)是ProgressEvent)的時候,將遵循以下內(nèi)容:
進(jìn)度事件的e,是不會冒泡的e.bubbles = false
進(jìn)度事件的事件對象e是不可取消的 e.cancelable = false
術(shù)語“觸發(fā)一個事件(fire an event)”是在DOM Core規(guī)范中定義的。Progress Event是Progress Events規(guī)范定義的
const reader = new FileReader(); reader.onload = function (e) { console.log(e.target === this) // true console.log(this === reader) // true console.log(e.bubbles === false) // true console.log(e. cancelable === false) // true console.log(e.cancelBubble === false) // true console.log(console.log(e.constructor.toString())) // function ProgressEvent() { [native code] } }
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/88606.html
摘要:以上傳圖片為例。我們可以通過獲取上傳的圖片相關(guān)信息,但是想要實現(xiàn)本地預(yù)覽還需要借助來實現(xiàn)可以讀取本地圖片,并將圖片數(shù)據(jù)轉(zhuǎn)換成編碼的字符串形式嵌入到頁面中。在我們實現(xiàn)上傳圖片的效果里,就有用到。圖片預(yù)覽兼容處理及以下版本不支持和。 最近項目里需要用到上傳圖片并預(yù)覽的功能,于是寫了個jQuery預(yù)覽圖片插件,下載地址。如果有需要的,可以直接下載。第一次寫jQuery插件,如有不對之處,歡迎...
摘要:我們的功能需要用到的接口事件讀取完成,無論成功與否,還有方法將文件讀取為。檢測是否為圖片類型圖片的編碼這里設(shè)置獲取的數(shù)據(jù)獲取后臺的給的將文件讀取為上傳事件當(dāng)?shù)臅r候說明我們成功的把圖片傳上七牛了,并且七牛給我們返回了一個字符串。 最近在做的一個聊天消息的功能。有個圖片上傳的功能,可以通過按鈕上傳也可以通過Ctrl+V上傳。按鈕上傳的我們可以通過七牛的API就可以做了,我們現(xiàn)在來說說Ctr...
摘要:創(chuàng)建新對象屬性讀取文件時發(fā)生的錯誤表明對象的當(dāng)前狀態(tài)讀取到的文件內(nèi)容,只在讀取操作完成后才有效,數(shù)據(jù)格式取決于采用的讀取操作方法中止該讀取操作。以純文本的形式讀取,中的數(shù)據(jù)為字符串。屬性中將包含一個格式的字符串。讀取文件的二進(jìn)制源碼。 file 提供文件有關(guān)的信息 1. file對象 file對象的來源一般分為3種: (1)在元素上選擇上傳文件后返回的Filelist對象; (2)由...
閱讀 2696·2023-04-26 03:00
閱讀 1489·2021-10-12 10:12
閱讀 4334·2021-09-22 15:33
閱讀 2999·2021-09-22 15:06
閱讀 1597·2019-08-30 15:44
閱讀 2203·2019-08-30 13:59
閱讀 580·2019-08-30 11:24
閱讀 2483·2019-08-29 17:07