html5图片上传使用FileReader预览

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

原文地址:https://www.cnblogs.com/Mohun-Blogs/p/10221895.html

时间: 2024-10-07 22:48:48

html5图片上传使用FileReader预览的相关文章

图片上传后及时预览

<!DOCTYPE html> <html> <head> <meta content="charset=utf-8" /> <!--设置图片上传后预览的div样式--> <style type="text/css"> *{ float:left; margin:0; } body>div{ width:200px; height:225px; text-align:center; } #

图片上传后即时预览

<!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content="text/html;charset=utf-8" /> //设置图片上传后预览的div样式 <style type="text/css"> #preview, .img, img { width: 200px; height: 200px; } #

图片上传前的预览(PHP)

1.先创建一个file表单域,我们需要用它来浏览本地文件.<form name="form1" id="form1" method="post" action="upload.php"><input type="file" name="file1" id="file1" /></form>2.试下效果: 判断文件类型:当用户选择了一

jquery实现图片上传前本地预览

<!DOCTYPE html><html><head lang="en"> <meta charset="UTF-8"> <title></title> <script src="js/jquery1.8.3-min.js"></script></head><body><div style="width:500p

web 图片上传实现本地预览

前言: 刚成为码农不久,第一次工作中接触图片上传功能,说到图片上传,大多数程序员可能都是先上传服务器,再获取路径.如果用户多长更改图片,服务器会产生许多垃圾文件.怎样用js实现本地预览.今天特意抽空百度研究了一下. 在说上传之前先说说如何替换or美化浏览器自带的简陋上传按钮(自定义自己的上传按钮 如:img): 1.将自定义上传按钮上方添加 input file 框,实现input实现透明处理. 2.对自定义上传按钮添加事件.隐藏真正input框.用事件来触发: function imgBtn(

调用相机,选择图片上传,带预览功能、图片压缩、相机文字设置、

摘要 iOS调用相机,iOS调用相册,保存至应用程序沙盒,高保真压缩图片,并有点击放大预览,再次点击缩回至原大小,带动画效果,附源码下载地址. Xcode版本4.5.1 类库ios6.0 IOS调用相机 图片预览 图片上传 压缩图片 模拟器添加图片 目录[-] 判断是否支持相机,跳转到相机或相册界面 七.保存图片 高保真压缩图片方法 八.实现点击图片预览功能,滑动放大缩小,带动画 ps:模拟器添加图片 源码下载地址: 一.新建工程 二.拖控件,创建映射 三.在.h中加入delegate ? 1

Asp.net中FileUpload控件实现图片上传并带预览显示

单一图片上传——“选择”+“上传”,.NET默认模式: 1.实现原理: 采用FileUpload控件默认的使用方式,先由“选择”按钮选择图片,然后单击“上传”按钮完成上传,并可在“上传”按钮的单击事件中加载已上传图片. 2.关键代码:     页面代码: 1 <asp:FileUpload ID="FileUpload" runat="server" /> 2 <asp:Button ID="BtnUp" runat="

基于Jcrop的图片上传裁剪加预览

1.页面结构 <div class="container"> <div class="row"> <div class="span12"> <div class="jc-demo-box"> <input type="file" id="fileChange" /> <div class="prew"

HTML5文件上传前本地预览

HTML5之FileReader的使用 HTML5定义了FileReader作为文件API的重要成员用于读取文件,根据W3C的定义,FileReader接口提供了读取文件的方法和包含读取结果的事件模型. FileReader的使用方式非常简单,可以按照如下步骤创建FileReader对象并调用其方法: 1.检测浏览器对FileReader的支持 if(window.FileReader) { var fr = new FileReader(); // add your code here } e