HTML5的FileReader对象实现图片预览及上传

一、关于FileReader;

1、FileReader即构造函数(构造对象),所以 必须 和 new 一起使用!

2、FileReader 对象允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用 File 或 Blob 对象指定要读取的文件或数据。

  其中File对象可以是来自用户在一个input元素上选择文件后返回的Filelist对象,也可以来自拖放操作生成的DataTransfer 对象,还可以是来自在一个 HTMLCanvasElement 上执行mozGetAsFile()方法后返回结果.

创建一个FileReader 对象 很简单,如下:

let reader = new FileReader(); //返回一个新构造的FileReader

3、FileReader接口的方法

 FileReader接口有4个方法,其中3个用来读取文件,另一个用来中断读取。无论读取成功或失败,方法并不会返回读取结果,这一结果存储在result属性中。

1. readAsBinaryString(file) : 将文件读取为二进制编码,

2. readAsText(file,[encoding]) : 将文件读取为文本,

3. readAsDataURL(file) : 将文件读取为DataURL,

4. abort(none) : 中断读取操作.

4、FileReader接口事件

 FileReader接口包含了一套完整的事件模型,用于捕获读取文件时的状态。

  事件	         描述
onabort	      中断时触发
onerror	      出错时触发
onload	      文件读取成功完成时触发
onloadend	  读取完成触发,无论成功或失败
onloadstart	  读取开始时触发
onprogress	  读取中

5、通过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

感谢!

猜你喜欢

转载自my.oschina.net/u/2395167/blog/1592234