演示webuploader和cropperjs图片裁剪上传

最近有个项目要在浏览器端裁剪并上传图片。由于缺乏人力,只能我上阵杀敌。通过参考各种文章,最后决定用cropperjs进行图片裁剪,用webuploader上传文件。本文涉及到的知识至少有Java基础、SpringMVC、thymeleaf模版引擎、JS基础、JQuery基础、Bootstrap组件,但是文章重点只是cropperjs和webuploader的组合运用,其他的都是辅助。

  • *2.1 选择文件按钮

previewImg用于预览上传后的图片;picker用于选择图片,webuploader会自动给picker赋予选择文件的特性。fileInput用于接收文件数据。


    选择图片

下面代码给fileInput组件触发了点击事件

    $("#picker").on('click', function () {
        $("#fileInput").trigger("click");
    });
  • *2.2 定义组件参数和事件

以下代码定义上传组件对象

    var uploader = WebUploader.create({
        auto: true,// 选完文件后,是否自动上传。
        server: '/upload',
        fileSingleSizeLimit: 2 * 1024 * 1024,
        duplicate: true,
        accept: {// 只允许选择图片文件。
            title: 'Images',
            extensions: 'jpg,jpeg,png',
            mimeTypes: 'image/jpg,image/jpeg,image/png'
        },
        //如果有表单数据要上传,可以给formData赋值
        formData: {
            id: 0
        }
    });

以下代码定义上传组件事件。WebUploader组件不提供UI,如果需要定制界面,实现下面的方法即可。

    //提交额外的表单数据
    uploader.on('uploadBeforeSend', function (object, data, header) {
        data.id = $('#id').val();
    });

    // 当有文件被添加进队列的时候
    uploader.on('fileQueued', function (file) {
        $('#file_list').append('' +
            '' + file.name + '' +
            '等待上传...' +
            '');
    });

    // 上传成功
    uploader.on('uploadSuccess', function (file, response) {
        $('#' + file.id).find('p.state').text('已上传');
        console.log(response._raw);
        var object = $.parseJSON(response._raw);
        //给预览组件赋值
        $('#previewImg').attr("src", object.url);
    });

    // 上传发生错误
    uploader.on('uploadError', function (file) {
        $('#' + file.id).find('p.state').text('上传出错');
    });

    // 上传中
    uploader.on('startUpload', function (file, rs) {
        console.log("文件正在上传中,请稍候");
    });
  • *2.3 定义裁剪组件参数和事件

以下代码定义裁剪图片的对话框,cropperImage是上传后的图片,被裁剪的目标对象。


                ×
                裁剪图片

                关闭
                保存

    var cropperImage = $("#cropperImage");
    var cropperOptions = {
        viewMode: 1,
        dragMode: 'none',
        aspectRatio: 1,
        background: false,
        autoCropArea: 0.6,
        crop: function (event) {
            //裁剪的实时事件
            console.log(event.detail.width);
            console.log(event.detail.height);
        },
        ready: function () {
            //限定裁剪区域大小为500
            cropperImage.cropper('crop');
            cropperImage.cropper('setData', {
                width: 500,
                height: 500
            })
        }
    };
  • *2.5 触发裁剪和上传事件

fileInput组件的change事件会采用FileReader对象获得上传的Image,初始化cropperjs裁剪方法。

    $("#fileInput").on('change', function () {
        var file = this.files[0];
        //定义读文件对象
        var reader = new FileReader();
        reader.onload = function () {
            imageOnload(reader.result);

        };
        reader.readAsDataURL(file);//File对象转换为dataURL
    });

    //图片对象加载方法
    function imageOnload(url) {
        var cropperImg = new Image();
        cropperImg.src = url;
        //destroy方法是为了重入不出错
        cropperImage.cropper('destroy').attr('src', url).cropper(cropperOptions);
        cropperImg.onload = function () {
            //弹窗裁剪
            $('#cropperImageModal').modal();
            $("#modalClose").on('click', function () {
                $("#fileInput").val('');
                $('#cropperImageModal').modal('hide');
            });

            $("#modalSubmit").on('click', function () {
                var canVas = $("#cropperImage").cropper("getCroppedCanvas", {});//获取裁剪后得到的canvas数据
                var file = convertBase64UrlToBlob(canVas.toDataURL('image/jpeg', '0.0'));//将canvas转换为Blob格式
                uploader.addFiles(file);//将裁剪后的图片添加进webuploader上传到后台
                $('#cropperImageModal').modal('hide');
                $("#fileInput").val('');
            });
        };
    }

采用 cropperImage.cropper('getCroppedCanvas').toblob(function(blob){})也可以获取图片二进制对象,但是默认是png格式,体积很大,不利于网络传输,采用下面的方法可以指定图片格式。

    /**
     * base64转为blob,图片为jpeg格式
     */
    function convertBase64UrlToBlob(urlData) {
        //去掉url的头,并转换为byte
        var bytes = window.atob(urlData.split(',')[1]);
        //处理异常,将ascii码小于0的转换为大于0
        var ab = new ArrayBuffer(bytes.length);
        var ia = new Uint8Array(ab);
        for (var i = 0; i < bytes.length; i++) {
            ia[i] = bytes.charCodeAt(i);
        }
        return new Blob([ab], {type: 'image/jpeg'});
    }
  • *2.6 后端接口实现

@Controller
public class IndexController {

    protected final Logger logger = LoggerFactory.getLogger(getClass());

    @RequestMapping("/index")
    public String list(ModelMap map) {
        return "index";
    }

    @PostMapping("/upload")
    @ResponseBody
    public UploadFileVo uploadFile(@RequestParam("file") MultipartFile file, @RequestParam("id") Integer id, HttpServletResponse response) {
        response.setContentType("text/html");
        //保存图片到服务端,返回访问地址
        UploadFileVo uploadFileVo = new UploadFileVo();
        //这里为了演示,返回一张网图
        uploadFileVo.setUrl("https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png");
        logger.info("上传成功,url:{},id:{}", uploadFileVo.getUrl(), id);
        return uploadFileVo;
    }

}
  • 2.7 最终效果图
    演示webuploader和cropperjs图片裁剪上传

Original: https://www.cnblogs.com/xiaoyangjia/p/15677347.html
Author: 编码砖家
Title: 演示webuploader和cropperjs图片裁剪上传

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/578123/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • docker 安装nextcloud+onlyoffice+mysql

    环境 类目 版本 备注 操作系统 centos 7 64位 Docker 最新版 Docker compose 最新版 暂时没有用上可以不安装 nextcloud 最新版 only…

    Linux 2023年5月27日
    0105
  • DOS 解决不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接用–拓展—》批处理访问服务器共享文件夹,BAT命令连接局域网机子并打开文件夹

    解决不允许一个用户使用一个以上用户名与一个服务器或共享资源的多重连接用–拓展—》批处理访问服务器共享文件夹,BAT命令连接局域网机子并打开文件夹 问题描述:…

    Linux 2023年6月13日
    082
  • Linux 常用目录管理命令

    cp:复制文件或目录,直接复制,如,cp /root/install.sh /home cp -a:相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用),如 cp -a…

    Linux 2023年6月14日
    0112
  • 用无感知的方式为你的数据加上一层缓存

    前言 本篇文章会介绍一个我自己写的库,库地址在这里,主要作用是提供一个注解,在你方法上使用这个注解,库提供的功能会帮你把数据自动缓存起来,下次再调用这个方法只要入参是一致的则直接会…

    Linux 2023年6月14日
    0138
  • 利用卷积神经网络处理cifar图像分类

    这是一个图像分类的比赛CIFAR( CIFAR-10 – Object Recognition in Images ) 首先我们需要下载数据文件,地址: http://…

    Linux 2023年6月6日
    0120
  • 挂载mount

    挂载mount 1.查看系统挂载的磁盘情况 df df -h 2.挂载:mount 将光驱挂在到/mnt目录: mount /dev/cdrom /mnt #mount 准备挂载的…

    Linux 2023年6月11日
    096
  • String为什么不是基本数据类型

    java虚拟机处理基础类型与引用类型的方式是不一样的,对于基本类型,java虚拟机会为其分配数据类型实际占用的内存空间,对于引用类型变量,他仅仅是一个指向堆区中某个实例的指针。 O…

    Linux 2023年6月7日
    0108
  • .Net FW项目跑不起来且无Error信息

    阅文时长 | 0.17分钟字数统计 | 280.8字符主要内容 | 1、引言&背景 2、分析步骤 3、解决方案 4、声明与参考资料『.Net FW项目跑不起来且无Error…

    Linux 2023年6月13日
    0105
  • Netty-如何写一个Http服务器

    前言 动机 最近在学习Netty框架,发现Netty是支持Http协议的。加上以前看过Spring-MVC的源码,就想着二者能不能结合一下,整一个简易的web框架(PS:其实不是整…

    Linux 2023年6月7日
    0102
  • 设计模式——命令模式

    命令模式定义 将一个请求封装成一个对象,从而让你使用不同的请求把客户端参数化,对请求排队或者记录请求日志,可以提供命令的撤销和回复的功能。 Receive接收者角色 该角色就是干活…

    Linux 2023年6月7日
    0113
  • k8安装

    1.安装k8s之前需要安装docker,etcd 因为要在k8s的pod中运行容器,需要先安装 容器运行时(Container Runtimes ) 几种常见的容器运行时与 Kub…

    Linux 2023年6月13日
    099
  • source insight4.0最常用到的设置

    1、常用功能 1.1:全局查找 1.2:当前文件查找 1.3:高亮设置 1.4:配置字体以及其他 1.5:配置自动缩进 1.6:其他 1. 常用功能 全局查找 Ctl+/ 查找到的…

    Linux 2023年5月27日
    0135
  • 操作系统实战45讲 -04 业界成熟的内核架构长什么样

    Linux 系统性能稳定且开源。在很多公司企业网络中被当作服务器来使用,这是 Linux 的一大亮点,也是它得以壮大的关键。 上图中大致分为五大重要组件,每个组件又分成许多模块从上…

    Linux 2023年6月7日
    0123
  • redis 常用命令

    批量删除redis key redis-cli -a xxx keys “prefix_tb_supplier:spl_id*” | xargs redis…

    Linux 2023年5月28日
    093
  • 【C++基础】数据类型

    C++规定在创建一个变量或者产量时,必须要指定相应的数据类型,否则无法给变量分配内存空间 数据类型的存在意义:给变量分配合适的内存空间 整型 作用:整型变量表示的是整数类型的数据 …

    Linux 2023年6月13日
    099
  • PHP array_values()

    array_values array_values() 函数返回一个包含给定数组中所有键值的数组,但不保留键名。 示例: function arrayValues() { $dat…

    Linux 2023年6月7日
    0107
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球