HTML5之FileReader介面讀取文件

来源:http://www.cnblogs.com/jiapengsongweb/archive/2017/07/19/7206376.html
-Advertisement-
Play Games

HTML5之FileReader介面讀取文件 1.FileReader介面的方法 2.FileReader介面事件 3.FileReader介面的使用 1 <!DOCTYPE HTML> 2 <html> 3 <head> 4 <meta http-equiv="Content-Type" cont ...


HTML5之FileReader介面讀取文件

用來把文件讀入記憶體,並且讀取文件中的數據。FileReader介面提供了一個非同步API,使用該API可以在瀏覽器主線程中非同步訪問文件系統,讀取文件中的數據。到目前為止,只有FF3.6+和Chrome6.0+實現了FileReader介面。



1.FileReader介面的方法

FileReader介面有4個方法,其中3個用來讀取文件,另一個用來中斷讀取。無論讀取成功或失敗,方法並不會返回讀取結果,這一結果存儲在result屬性中。



方法名                                                參數                                                                     描述

 

readAsBinaryString                                 file                                                       將文件讀取為二進位編碼

 

readAsText                                 file,[encoding]                  將文件讀取為文本,其中第二個參數是文本的編碼方式,預設值為 UTF-8

 

readAsDataURL                                 file                                                      將文件讀取為DataURL

 

abort                                              (none)                                                    終端讀取操作




2.FileReader介面事件


FileReader介面包含了一套完整的事件模型,用於捕獲讀取文件時的狀態。



   事件                              描述

 

onabort                               中斷

 

onerror                              出錯

 

onloadstart                     開始

 

onprogress                 正在讀取

 

onload                        成功讀取

 

onloadend        讀取完成,無論成功失敗





3.FileReader介面的使用


文件一旦開始讀取,無論成功或失敗,實例的 result 屬性都會被填充。如果讀取失敗,則 result 的值為 null ,否則即是讀取的結果,絕大多數的程式都會在成功讀取文件的時候,抓取這個值。



var reader=new FileReader();

 

reader.onload = function() {  

 

                    this.result;  

 

};  

 

//

 

var reader=new FileReader();

 

reader.onload = function(e) {  

 

                    e.target.result;  

 

};  



例子1:

  

 
 1 <!DOCTYPE HTML>
 2 <html>
 3 <head>
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 5 <title>無標題文檔</title>
 6 <style>
 7 img{
 8     width:100px;
 9     height:100px;
10 }
11 </style>
12 </head>
13 <body>
14 <script type="text/javascript">
15 if(typeof FileReader == 'undefined'){    //判斷瀏覽器是否支持FileReader介面  
16     var div=document.getElementById("dd");
17     div.innerHTML='你的瀏覽器不支持FileReader介面!';
18     document.getElementById("file").setAttribute("disabled","disabled");
19     document.getElementById("filea").setAttribute("disabled","disabled");
20     document.getElementById("fileb").setAttribute("disabled","disabled");
21 }
22 
23 function show(){
24     var file=document.getElementById("file").files[0];
25     var reg=/image\/\w+/;
26     if(!reg.test(file.type)){    //判斷是否為圖片
27         return false;
28     }
29     if(file){
30         var reader = new FileReader();
31         reader.onload = function ( event ) {
32             var txt = event.target.result;
33             var img = document.createElement("img");
34             img.src = txt;
35             document.getElementById("content").appendChild( img );
36         }
37     }
38     reader.readAsDataURL(file);
39 } 
40 function aShow(){
41     var file=document.getElementById("filea").files[0];
42     if(file){
43         var reader=new FileReader();
44         reader.onload=function(){
45             var cona=document.getElementById("contenta");
46             cona.innerHTML=this.result;
47         }
48     }
49     reader.readAsBinaryString(file);
50 }
51 function bShow(){
52     var file=document.getElementById("fileb").files[0];
53     if(file){
54         var reader=new FileReader();
55         reader.onload=function(e){
56             var conb=document.getElementById("contentb");
57             conb.innerHTML=e.target.result;
58         }
59     }
60     reader.readAsText(file);
61 }
62 </script> 
63 <div id="dd"> </div>
64 <p>圖像:<input type="file" name="file" id='file' onchange='show()'/></p>
65 <p id='content'></p>
66 <p>二進位文件:<input type="file" name="file" id='filea' onchange='aShow()'/></p>
67 <p id='contenta'></p>
68 <p>文本文件:<input type="file" name="file" id='fileb' onchange='bShow()'/></p>
69 <p id='contentb'></p>
70 </body>
71 </html>

 



例子2:相容IE的上傳圖片

 

        
 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
 2 <html xmlns="http://www.w3.org/1999/xhtml">
 3 <head>     
 4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />     
 5 <title>圖片上傳本地預覽</title>     
 6 <style type="text/css">
 7 #preview{width:547px;height:626px;border:1px solid #000;overflow:hidden;}
 8 #imghead {filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=image);}
 9 input{margin-top:20px;}
10 </style>
11 <script type="text/javascript">
12 
13 
14                 //圖片上傳預覽    IE是用了濾鏡。
15         function previewImage(file)
16         {
17           var MAXWIDTH  = 547; 
18           var MAXHEIGHT = 626;
19           var div = document.getElementById('preview');
20           if (file.files && file.files[0])
21           {
22               div.innerHTML ='<img id=imghead>';
23               var img = document.getElementById('imghead');
24               img.onload = function(){
25                 var rect = clacImgZoomParam(MAXWIDTH, MAXHEIGHT, img.offsetWidth, img.offsetHeight);
26                 img.width  =  rect.width;
27                 img.height =  rect.height;
28 //                 img.style.marginLeft = rect.left+'px';
29                 img.style.marginTop = rect.top+'px';
30               }
31               var reader = new FileReader();
32               reader.onload = function(evt){img.src = evt.target.result;}
33               reader.readAsDataURL(file.files[0]);
34           }
35           else //相容IE
36           {
37             var sFilter='filter:progid:DXImageTransform.Microsoft.AlphaImageLoader(sizingMethod=scale,src="';
38             file.select();
39             var src = document.selection.createRange().text;
40             div.innerHTML = '<img id=imghead>';
41             var img = document.getElementById('imghead');
42             img.filters.item('DXImageTransform.Microsoft.AlphaImageLoader').src = src;
43             var rect = clacImgZoomParam(MAXWIDTH, MAXHEIGHT, img.offsetWidth, img.offsetHeight);
44             status =('rect:'+rect.top+','+rect.left+','+rect.width+','+rect.height);
45             div.innerHTML = "<div id=divhead style='width:"+rect.width+"px;height:"+rect.height+"px;margin-top:"+rect.top+"px;"+sFilter+src+"\"'></div>";
46           }
47         }
48         function clacImgZoomParam( maxWidth, maxHeight, width, height ){
49             var param = {top:0, left:0, width:width, height:height};
50             if( width>maxWidth || height>maxHeight )
51             {
52                 rateWidth = width / maxWidth;
53                 rateHeight = height / maxHeight;
54                 
55                 if( rateWidth > rateHeight )
56                 {
57                     param.width =  maxWidth;
58                     param.height = Math.round(height / rateWidth);
59                 }else
60                 {
61                     param.width = Math.round(width / rateHeight);
62                     param.height = maxHeight;
63                 }
64             }
65             
66             param.left = Math.round((maxWidth - param.width) / 2);
67             param.top = Math.round((maxHeight - param.height) / 2);
68             return param;
69         }
70 </script>     
71 </head>     
72 <body>
73      
74     <input type="file" onchange="previewImage(this)" />  
75     <div id="preview">
76         <img id="imghead" src=''>
77     </div>   
78 </body>     
79 </html>

 



示例3:有上傳進度條

 

既然FileReader是非同步讀取文件內容,那麼就應該可以監聽它的讀取進度。事實上,FileReader的onloadstart以及onprogress等事件,可以用來監聽FileReader的讀取進度。



       在onprogress的事件處理器中,提供了一個ProgressEvent對象,這個事件對象實際上繼承了Event對象,提供了三個只讀屬性:lengthComputable、loaded、total;通過以上幾個屬性,即可實時顯示讀取進度。w3c官網上對它的定義如下:

 

       

 

         interface ProgressEvent : Event {

 

                      readonly attribute boolean lengthComputable;

 

                     readonly attribute unsigned long long loaded;

 

                      readonly attribute unsigned long long total;

 

         };



      如果處理的文件太大,可能會導致瀏覽器崩潰(chrome下一般都會崩潰掉,而firefox則不會,不過會觸發FileReader的onerror事件,文件讀取失敗),所以為了安全地、正常地觀察到文件讀取進度,我們採用分段讀取的方法來測試FileReader的進度條。
  1 <!DOCTYPE HTML>
  2 <html>
  3 <head>
  4 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  5 <title>無標題文檔</title>
  6 
  7 </head>
  8 
  9 <body>
 10 <form>  
 11     <fieldset>  
 12         <legend>分度讀取文件:</legend>  
 13         <input type="file" id="file" />  
 14         <input type="button" value="中斷" id="Abort" />  
 15         <p>  
 16             <label>讀取進度:</label><progress id="Progress" value="0" max="100"></progress>  
 17         </p>  
 18         <p id="Status"></p>  
 19     </fieldset>  
 20 </form>  
 21 <script>
 22     var h = {  
 23     init: function	   

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、下載地址:https://github.com/kartik-v/bootstrap-fileinput/ 打開壓縮包中的example/index.html查看示例。根據示例的代碼選擇需要的控制項代碼使用。 2、需要結合bootstrap使用,即頁面需要引入bootstrap相關js和css文件 ...
  • 代碼下載:https://github.com/lima-helen/vue-click-link 解決辦法有很多,之前也有看到同學用的是跳轉到空白頁,然後再跳路由以達到監控路由的目的; 這裡的解決辦法是: 在bottom.vue中接收並wath 該數值以達到不同數值為不同的狀態 ...
  • for迴圈裡面的break;和continue;語句 break語句 哇,我已經找到我要的答案了,我不需要進行更多的迴圈了! 比如,尋找第一個能被5整除的數: for迴圈中,如果遇見了break語句,這個for迴圈就會立即終止,不在進行其他的迭代了。 for(var i = 1 ; i <= 100 ...
  • 事件的預設傳播機制: 捕獲階段:從外向里依次查找元素 目標階段:從當前事件源本身的操作 冒泡階段:從內到外依次觸發相關的行為(我們最常用的就是冒泡階段) 具體見下圖: ...
  • 1、z-index基礎 z-index含義:指定了元素及其子元素的”z順序“,而”z順序“可以決定元素的覆蓋順序。z-index值越大越在上面。 z-index值:auto(預設值);integer(整數值);inherit(繼承)。 z-index基本特性:①支持負值;②支持CSS3 animat ...
  • 代碼下載地址:https://github.com/lima-helen/vue-cli- Vue-cli和element ui配置網上都有,這裡就不多說了; ...
  • ———————————————————————————————————————————— 基礎表單驗證(純js) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ...
  • 1、什麼是事件? 事件分為兩部分: 1)、行為本身:瀏覽器天生就賦予其的行為 onclick 、onmouseover(onmouseenter)、onmouseout(onmouseleave)、onmousemove、onmousedown、onmouseup、onmousewheel(滑鼠滾輪 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...