HTML5之FileReader的使用.RP

HTML5定義了FileReader做爲文件API的重要成員用於讀取文件,根據W3C的定義,FileReader接口提供了讀取文件的方法和包含讀取結果的事件模型。javascript

 

FileReader的使用方式很是簡單,能夠按照以下步驟建立FileReader對象並調用其方法:html

1.檢測瀏覽器對FileReader的支持java

 

[javascript] view plain copy
  1. if(window.FileReader) {  
  2.     var fr = new FileReader();  
  3.     // add your code here  
  4. }  
  5. else {  
  6.     alert("Not supported by your browser!");  
  7. }  



 

2. 調用FileReader對象的方法web

 

FileReader 的實例擁有 4 個方法,其中 3 個用以讀取文件,另外一個用來中斷讀取。下面的表格列出了這些方法以及他們的參數和功能,須要注意的是 ,不管讀取成功或失敗,方法並不會返回讀取結果,這一結果存儲在 result屬性中。正則表達式

方法名 參數 描述
abort none 中斷讀取
readAsBinaryString file 將文件讀取爲二進制碼
readAsDataURL file 將文件讀取爲 DataURL
readAsText file, [encoding] 將文件讀取爲文本

readAsText:該方法有兩個參數,其中第二個參數是文本的編碼方式,默認值爲 UTF-8。這個方法很是容易理解,將文件以文本方式讀取,讀取的結果便是這個文本文件中的內容。 readAsBinaryString:該方法將文件讀取爲二進制字符串,一般咱們將它傳送到後端,後端能夠經過這段字符串存儲文件。 readAsDataURL:這是例子程序中用到的方法,該方法將文件讀取爲一段以 data: 開頭的字符串,這段字符串的實質就是 Data URL,Data URL是一種將小文件直接嵌入文檔的方案。這裏的小文件一般是指圖像與 html 等格式的文件。後端

 

3. 處理事件瀏覽器

 

FileReader 包含了一套完整的事件模型,用於捕獲讀取文件時的狀態,下面這個表格概括了這些事件。app

事件 描述
onabort 中斷時觸發
onerror 出錯時觸發
onload 文件讀取成功完成時觸發
onloadend 讀取完成觸發,不管成功或失敗
onloadstart 讀取開始時觸發
onprogress 讀取中

文件一旦開始讀取,不管成功或失敗,實例的 result 屬性都會被填充。若是讀取失敗,則 result 的值爲 null ,不然便是讀取的結果,絕大多數的程序都會在成功讀取文件的時候,抓取這個值。oop

 

[javascript] view plain copy
  1. fr.onload = function() {  
  2.     this.result;  
  3. };  

 

 

下面經過一個上傳圖片預覽和帶進度條上傳來展現FileReader的使用。this

 

[html] view plain copy
  1. <script type="text/javascript">  
  2.         function showPreview(source) {  
  3.             var file = source.files[0];  
  4.             if(window.FileReader) {  
  5.                 var fr = new FileReader();  
  6.                 fr.onloadend = function(e) {  
  7.                     document.getElementById("portrait").src = e.target.result;  
  8.                 };  
  9.                 fr.readAsDataURL(file);  
  10.             }  
  11.         }  
  12.     </script>  
  13.   
  14. <input type="file" name="file" onchange="showPreview(this)" />  
  15.                                 <img id="portrait" src="" width="70" height="75">  

 

若是要限定上傳文件的類型,能夠經過文件選擇器獲取文件對象並經過type屬性來檢查文件類型

 

[javascript] view plain copy
  1. if(!/image\/\w+/.test(file.type)){  
  2.     alert("請確保文件爲圖像類型");  
  3.     return false;  
  4. }  

 

不難發現這個檢測是基於正則表達式的,所以能夠進行各類複雜的匹配,很是有用。

若是要增長一個進度條,可使用HTML 5的progress標籤,經過下面的代碼實現。

 

[html] view plain copy
  1. <form>  
  2.     <fieldset>  
  3.         <legend>分度讀取文件:</legend>  
  4.         <input type="file" id="File" />  
  5.         <input type="button" value="中斷" id="Abort" />  
  6.         <p>  
  7.             <label>讀取進度:</label><progress id="Progress" value="0" max="100"></progress>  
  8.         </p>  
  9.         <id="Status"></p>  
  10.     </fieldset>  
  11. </form>  

 

[javascript] view plain copy
    1. var h = {  
    2.     init: function() {  
    3.         var me = this;  
    4.            
    5.         document.getElementById('File').onchange = me.fileHandler;  
    6.         document.getElementById('Abort').onclick = me.abortHandler;  
    7.            
    8.         me.status = document.getElementById('Status');  
    9.         me.progress = document.getElementById('Progress');  
    10.         me.percent = document.getElementById('Percent');  
    11.            
    12.         me.loaded = 0;  
    13.         //每次讀取1M  
    14.         me.step = 1024 * 1024;  
    15.         me.times = 0;  
    16.     },  
    17.     fileHandler: function(e) {  
    18.         var me = h;  
    19.            
    20.         var file = me.file = this.files[0];  
    21.            
    22.         var reader = me.reader = new FileReader();  
    23.            
    24.         //  
    25.         me.total = file.size;  
    26.            
    27.         reader.onloadstart = me.onLoadStart;  
    28.         reader.onprogress = me.onProgress;  
    29.         reader.onabort = me.onAbort;  
    30.         reader.onerror = me.onerror;  
    31.         reader.onload = me.onLoad;  
    32.         reader.onloadend = me.onLoadEnd;  
    33.         //讀取第一塊  
    34.         me.readBlob(file, 0);  
    35.     },  
    36.     onLoadStart: function() {  
    37.         var me = h;  
    38.     },  
    39.     onProgress: function(e) {  
    40.         var me = h;  
    41.            
    42.         me.loaded += e.loaded;  
    43.         //更新進度條  
    44.         me.progress.value = (me.loaded / me.total) * 100;  
    45.     },  
    46.     onAbort: function() {  
    47.         var me = h;  
    48.     },  
    49.     onError: function() {  
    50.         var me = h;  
    51.            
    52.     },  
    53.     onLoad: function() {  
    54.         var me = h;  
    55.    
    56.         if(me.loaded < me.total) {  
    57.             me.readBlob(me.loaded);  
    58.         } else {  
    59.             me.loaded = me.total;  
    60.         }  
    61.     },  
    62.     onLoadEnd: function() {  
    63.         var me = h;  
    64.            
    65.     },  
    66.     readBlob: function(start) {  
    67.         var me = h;  
    68.            
    69.         var blob,  
    70.             file = me.file;  
    71.            
    72.         me.times += 1;  
    73.            
    74.         if(file.webkitSlice) {  
    75.             blob = file.webkitSlice(start, start + me.step + 1);  
    76.         } else if(file.mozSlice) {  
    77.             blob = file.mozSlice(start, start + me.step + 1);  
    78.         }  
    79.            
    80.         me.reader.readAsText(blob);  
    81.     },  
    82.     abortHandler: function() {  
    83.         var me = h;  
    84.            
    85.         if(me.reader) {  
    86.             me.reader.abort();  
    87.         }  
    88.     }  
    89. };  
    90.    
    91. h.init();  

 

 

文轉: blog.csdn.net/jackfrued/article/details/8967667

相關文章
相關標籤/搜索