通过FileReader,和es6的方法解构赋值,promise对象简单封装上传预览
具体逻辑:选中图片之后,触发onchange方法,获得上传文件对象,调用fileReader方法验证图片是否符合上传需求,符合返回图片文本,不符合返回错误信息。
先介绍几个技术点,没接触过的朋友,可以先看看:
Promise
对象:是异步编程的一种解决方案,里面保存着某个未来才会结束的事件的结果。Promise 提供统一的 API,各种异步操作都可以用同样的方法进行处理。技术连接:http://es6.ruanyifeng.com/#docs/promise
解构赋值:按照一定模式,从数组和对象中提取值,对变量进行赋值。技术链接:http://es6.ruanyifeng.com/#docs/destructuring
FileReader
对象:允许Web应用程序异步读取存储在用户计算机上的文件(或原始数据缓冲区)的内容,使用file或blob对象指定要读取的文件或数据。技术链接:https://developer.mozilla.org/zh-CN/docs/Web/API/FileReader
图片的预览处理逻辑
???/** ????* @description ????????接收jpg,png,gif后缀的图片,返回图片文本 ????* @param obj.file ?????文件对象, File.files[0] ????* @param obj.size ?????预览文件大小(kb),默认值200 ????* @param obj.width ????图片宽度,默认为200px ????* @param obj.height ???图片高度,默认为200px ????* @return ?Promise ????* */ ???function fileReader({file = null, size = 200, width = 200, height = 200} = {}) { ???????return new Promise((resolve, reject) => { ???????????????if (!/\.(jpe?g|png|gif)$/i.test(file.name)) { ???????????????????reject(‘请后缀为jpg,png,gif的图片‘); ???????????????} ???????????????let imgSize = file.size / 1024; ?//计算文件大小,单位kb ???????????????if (imgSize > file.size) { ???????????????????reject(‘请上传大小不要超过‘ + size + ‘kb的图片‘); ???????????????} ???????????????let reader = new FileReader(); ???????????????reader.onload = ((e) => { ???????????????????//创建一个image对象,判断宽高 ???????????????????let image = new Image(); ???????????????????image.onload = (() => { ???????????????????????if (image.width != width || image.height != height) { ???????????????????????????reject("图片宽高必须为:" + width + "*" + height); ???????????????????????} ???????????????????????resolve(e.target.result); ???????????????????}); ???????????????????image.src = e.target.result; ???????????????}); ???????????????reader.readAsDataURL(file); ???????????} ???????) ???}
方法参数使用解构赋值,设置默认值,具体默认值请结合项目设置;使用Promise
对象创建实例new Promise((resolve, reject) => {});resolve,reject是两个函数,resolve将Promise
对象的状态从“未完成”变为“成功”,reject将Promise
对象的状态从“未完成”变为“失败”,如果图片不符合要求,相关提示通通调用reject函数。创建一个图片对象,主要是获取图片的宽高做验证,如果使用图片裁剪,请忽略此步骤。如果宽高验证成功,将图片文本传入给resolve函数。
调用fileReader函数
function fileLoad(e) {
??????let fileObj = { ???????????file: e.files[0], ?//图片对象 ???????????size: 100, ???????//图片最大为100kb ???????????width: 700, ??????//上传图片宽度 ???????????height: 700 ??????//上传图片高度 ???????} ???????fileReader(fileObj).then(data => { ???????????//文件预览正确,将图片展示到页面 ???????????document.getElementById("preview").innerHTML = "<img src=‘" + data + "‘/>"; ???????????document.getElementById("error").innerHTML = ""; ???????}, error => { ???????????//文件预览出错了,根据项目提示用户 ???????????document.getElementById("preview").innerHTML = ""; ???????????document.getElementById("error").innerHTML = "错误信息:" + error; ???????}); ???}
定义图片上传要求,根据fileReader处理情况,then
方法可以接受两个回调函数作为参数。第一个回调函数是Promise
对象的状态变为resolved
时调用,第二个回调函数是Promise
对象的状态变为rejected
时调用。其中,第二个函数是可选的,不一定要提供。这两个函数都接受Promise
对象传出的值作为参数。
在线测试链接:https://www.lqmohun.com/demo/FileReader.html
推荐一个免费Api网站:https://www.lqmohun.com
html5图片上传使用FileReader预览
原文地址:https://www.cnblogs.com/Mohun-Blogs/p/10221895.html