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
感谢!