HTML5的FileReader對象實現圖片預覽及上傳

1、關於FileReader;javascript

一、FileReader即構造函數(構造對象),因此 必須 和 new 一塊兒使用!css

二、FileReader 對象容許Web應用程序異步讀取存儲在用戶計算機上的文件(或原始數據緩衝區)的內容,使用 File 或 Blob 對象指定要讀取的文件或數據。html

  其中File對象能夠是來自用戶在一個input元素上選擇文件後返回的Filelist對象,也能夠來自拖放操做生成的DataTransfer 對象,還能夠是來自在一個 HTMLCanvasElement 上執行mozGetAsFile()方法後返回結果.前端

建立一個FileReader 對象 很簡單,以下:java

let reader = new FileReader(); //返回一個新構造的FileReader

三、FileReader接口的方法數據庫

 FileReader接口有4個方法,其中3個用來讀取文件,另外一個用來中斷讀取。不管讀取成功或失敗,方法並不會返回讀取結果,這一結果存儲在result屬性中。瀏覽器

1. readAsBinaryString(file) : 將文件讀取爲二進制編碼,

2. readAsText(file,[encoding]) : 將文件讀取爲文本,

3. readAsDataURL(file) : 將文件讀取爲DataURL,

4. abort(none) : 中斷讀取操做.

四、FileReader接口事件緩存

 FileReader接口包含了一套完整的事件模型,用於捕獲讀取文件時的狀態。服務器

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

五、經過FileReader對象實現圖片預覽及上傳:異步

  FileReader 的 readAsDataURL()方法 能夠將 圖片 轉化成data64位的字符串,便可以將圖片 以字符串參數 存入數據庫。這樣的的優點 在於:前端能夠少對一個 接口(後臺少寫個接口)。最重要的是 服務器 不會儲存垃圾文件!

//首先檢測瀏覽器對FileReader的兼容性
if(window.FileReader) {  //支持 or  if(typeof FileReader != 'undefined'){  
  alert("支持!");
}else {  
  alert("不支持!");  
}  

//html代碼和 css 代碼
//.upload-pic-box{width:120px;height:120px;position:relative;}
//.upload-pic-box img{width:120px;height:120px;}
//.upload-pic-box input{width:120px;height:120px;position:absolute;left:0px;top:0px; opacity:0;}

<div className="upload-pic-box">
    <img src={this.state.fileUrl} alt="" id="portrait"/>
    <input id="uploadImage" type="file" name="file" onChange={this.showPreview}/>
    //<input type="file" multiple name="" id="uploadImage" value="" accept="image/jpeg,image/png">
    //multiple 支持多個文件同時上傳 accept:設置當前file支持的文件格式
</div>

//js代碼
showPreview = (ev) => {
      var _this = this;
      var file = ev.target.files[0];
      //獲取文件類型
      const fileType = file.type;
      //檢測是否爲圖像文件 
      if(!/image\/\w+/.test(file.type)){  
        alert("該文件不是圖片類型,請從新選擇!");  
        return;  
      } 
 
      //獲取圖片大小,file.size獲取到的單位爲 B,將其轉換爲kb,並保留二位小數點
      const  fileSize =(file.size / 1024).toFixed(2);
      if(Number(fileSize) > (1024 * 1024)){
         message.warn("圖片不能大於1M!");
         return;
      }
      if(window.FileReader) {  
          var fr = new FileReader();  
          fr.onloadend = function(e) { 
              // e.total:文件總大小 e.loaded:當前已下載大小 e.target.result:文件轉化結果
              //document.getElementById("portrait").src = e.target.result;
              _this.setState({
                 fileUrl: e.target.result
               });
              //緩存當前64位url  
              _this.state.uploadPicData = e.target.result;
          };  
          fr.readAsDataURL(file);  
      }  
  }

 

參考文獻:

https://www.cnblogs.com/exhuasted/p/6170562.html

https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader

http://blog.csdn.net/jackfrued/article/details/8967667

http://blog.csdn.net/tonvchong/article/details/22193435

http://blog.csdn.net/u014236259/article/details/52885591

感謝!

相關文章
相關標籤/搜索