HTML5 文件處理之FileAPI簡介整理


  在眾多HTML5規范中,有一部分規范是跟文件處理有關的,在早期的瀏覽器技術中,處理小量字符串是js最擅長的處理之一。但文件處理,尤其是二進制文件處理,一直是個空白。在一些情況下,我們不得不通過Flash/ActiveX/NP插件或雲端的服務器處理較為復雜或底層的數據。今天,HTML5的一系列新規范正在致力於讓瀏覽器具備更強大的文件處理能力。

今天要介紹的FileAPI,就是為解決這類問題而生的。

總覽

FileAPI是一些列文件處理規范的基礎,包含最基礎的文件操作的JavaScript接口設計。其中最主要的接口定義一共有4個:

◆ FileList接口: 可以用來代表一組文件的JS對象,比如用戶通過input[type="file"]元素選中的本地文件列表,

◆ Blob接口: 用來代表一段二進制數據,並且允許我們通過JS對其數據以字節為單位進行“切割”,關於Blob對象

◆ File接口: 用來代步一個文件,是從Blob接口繼承而來的,並在此基礎上增加了諸如文件名、MIME類型之類的特性,關於File對象

◆ FileReader接口: 提供讀取文件的方法和事件

這里有兩點細節需要注意:

1. 我們平時使用input[type="file"]元素都是選中單個文件,其本身是允許同時選中多個文件的,所以會用到FileList

2. Blob接口和File接口可以返回數據的字節數等信息,也可以“切割”,但無法獲取真正的內容,這也正是FileReader存在的意義,而文件大小不一時,讀取文件可能存在明顯的時間花費,所以我們用異步的方式,通過觸發另外的事件來返回讀取到的文件內容

接口描述

這4個接口其實並不復雜,也很好理解(接口中的“#Foo”表示任意Foo類型的對象):

FileList接口

#FileList[index] // 得到第index個文件 

Blob接口

#Blob.size // 只讀特性,數據的字節數  
#Blob.slice(start, length) // 將當前文件切割並將結果返回 

File接口

#File.size // 繼承自Blob,意義同上  
#File.slice(start, length) // 繼承自Blob,意義同上  
#File.name // 只讀屬性,文件名  
#File.type // 只讀屬性,文件的MIME類型  
#File.lastModifiedDate // 只讀屬性,最后文件修改時間

FileReader方法

#FileReader.readAsArrayBuffer(blob/file)   //將讀取結果 封裝成 ArrayBuffer ,如果想使用一般需要轉換成 Int8Array或DataView
#FileReader.readAsBinaryString(blob/file) // 以二進制格式讀取文件內容  
#FileReader.readAsText(file, [encoding]) // 以文本(及字符串)格式讀取文件內容,並且可以強制選擇文件編碼  
#FileReader.readAsDataURL(file) // 以DataURL格式讀取文件內容  
#FileReader.abort() // 終止讀取操作 

FileReader事件

#FileReader.onloadstart // 讀取操作開始時觸發  
#FileReader.onload // 讀取操作成功時觸發  
#FileReader.onloadend // 讀取操作完成時觸發(不論成功還是失敗)  
#FileReader.onprogress // 讀取操作過程中觸發  
#FileReader.onabort // 讀取操作被中斷時觸發  
#FileReader.onerror // 讀取操作失敗時觸發 

FileReader屬性

#FileReader.result // 讀取的結果(二進制、文本或DataURL格式)  
#FileReader.readyState // 讀取操作的狀態(EMPTY、LOADING、DONE) 

代碼示例

舉例一:控制file控件,讀取其中的第二個文件,並將其文本內容在控制台輸出

var input = document.querySelector('input[type="file"]'); // 找到第一個file控件  
var firstFile = input.files[0]; // file控件的files特性其實就是一個FileList類型的對象  
var secondFile = input.files[1]; // 當file控件的multiple特性為true時,我們可以同時選擇多個文件,通過input.files[n]可以按序訪問這些文件  
var reader = new FileReader(); // 新建一個FileReader類型的對象  
reader.readAsText(secondFile); // 按文本格式讀取file控件中的第二個文件  
reader.onloadend = function (e) { // 綁定讀取操作完成的事件  
    console.log(reader.result); // 取得讀取結果並輸出  
}; 

舉例二:給一個含utf-8編碼的文本文件file去掉BOM頭信息

var size = file.size; // 先取得文件總字節數  
var result = file.slice(3, size - 3); // 用slice方法去掉開頭的3個字節 

最后,對FileAPI實踐的注意

規范中還明確規定了各種出錯處理和異常處理,這些內容是同樣重要的:不論對於一套完備的規范,還是對於一個健壯的程序而言。由於篇幅有限,這部分就不細說了,大家可以在W3C官網自由查閱

以上就是FileAPI的簡單介紹。萬丈高樓平地起,后面的文件操作會更神奇更有趣。

更多:

HTML5 FileAPI讀取實例---(一)

HTML5中的二進制大對象Blob(轉)

HTML5 File 對象

HTML5 文件域+FileReader 讀取文件(一)

HTML5 FileReader讀取Blob對象API詳解

原文:http://bulaoge.net/topic.blg?dmn=g3g4&tid=2344378#Content


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM