演示webuploader和cropperjs图片裁剪上传
最近有个项目要在浏览器端裁剪并上传图片。由于缺乏人力,只能我上阵杀敌。通过参考各种文章,最后决定用cropperjs进行图片裁剪,用webuploader上传文件。本文涉及到的知识至少有Java基础、SpringMVC、thymeleaf模版引擎、JS基础、JQuery基础、Bootstrap组件,但是文章重点只是cropperjs和webuploader的组合运用,其他的都是辅助。
1. 依赖JS库
webuploader官网
cropperjs演示主页
cropperjs开源主页
2. 核心流程
- 2.1 选择文件按钮
previewImg用于预览上传后的图片;picker用于选择图片,webuploader会自动给picker赋予选择文件的特性。fileInput用于接收文件数据。
<div class="form-group">
<img id="previewImg" width="200px" />
<div>
<a href="javascript:void(0)" id="picker">选择图片</a>
<input type="file" id="fileInput" style="display: none" />
</div>
</div>
下面代码给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('<div id="' + file.id + '" class="item">' +
'<h4 class="info">' + file.name + '</h4>' +
'<p class="state">等待上传...</p>' +
'</div>');
});
// 上传成功
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是上传后的图片,被裁剪的目标对象。
<div class="modal" id="cropperImageModal" tabindex="-1" role="dialog" aria-labelledby="cropperImageModal"
aria-hidden="true">
<div class="modal-dialog" style="width: 50%;">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
<h4 class="modal-title">裁剪图片</h4>
</div>
<div class="modal-body">
<!-- cropperImage是上传后的图片,被裁剪的目标对象 -->
<img src="" id="cropperImage" style="max-width: 100%"/>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal" id="modalClose">关闭</button>
<button type="button" class="btn btn-primary" id="modalSubmit">保存</button>
</div>
</div>
</div>
</div>
以下代码定义图片裁剪参数,更多参数参考cropper.js的API详解。如果不需要固定裁剪区域大小,删除ready函数即可。
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 最终效果图

3. 完整代码
参考
https://www.codingbrick.com/archives/456.html
演示webuploader和cropperjs图片裁剪上传的更多相关文章
- PHP+jQuery.photoClip.js支持手势的图片裁剪上传实例
PHP+jQuery.photoClip.js支持手势的图片裁剪上传实例,在手机上双指捏合为缩放,双指旋转可根据旋转方向每次旋转90度,在电脑上鼠标滚轮为缩放,双击则顺时针旋转90度. 下面让我们来看 ...
- vue中使用cropperjs进行图片裁剪上传
下面代码直接就可以复制使用了,但是需要在本地下个cropperjs,下载命令:npm install cropperjs --save-dev <template> <div id= ...
- 微信小程序实现图片裁剪上传(wepy)
参考https://github.com/we-plugin/we-cropper,在wepy中实现,参考的具体例子是we-cropper/example/cutInside/ 项目上传图片时2:3的 ...
- 图片裁剪上传插件——jquery.photoClip.js
想要裁剪图片上传: 需要依赖的的插件为: [jquery.photoClip.js] 插件[iscroll-zoom.js] 插件[hammer.js] 插件 [lrz.all.bundle.js] ...
- PHP裁剪图片并上传完整demo
日前根据功能需求,要做一个图片裁剪上传的功能,在网上找了好久,找到了这位仁兄写的demo! 下载压缩包
- 三款不错的图片压缩上传插件(webuploader+localResizeIMG4+LUploader)
涉及到网页图片的交互,少不了图片的压缩上传,相关的插件有很多,相信大家都有用过,这里我就推荐三款,至于好处就仁者见仁喽: 1.名气最高的WebUploader,由Baidu FEX 团队开发,以H5为 ...
- PHP 多图上传,图片批量上传插件,webuploader.js,百度文件上传插件
PHP 多图上传,图片批量上传插件,webuploader.js,百度文件上传插件(案例教程) WebUploader作用:http://fex.baidu.com/webuploader/gett ...
- asp.net实现图片在线上传并在线裁剪
1.说明 接上一篇文章uploadify实现多附件上传完成后,又突然用到头像上传并在线裁剪.在网上找个众多例子都没有符合要求的,有一篇文章写的不错,就是文旺老兄写的这篇Asp.Net平台下的图片在线裁 ...
- HTML5 本地裁剪图片并上传至服务器(转)
很多情况下用户上传的图片都需要经过裁剪,比如头像啊什么的.但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁剪坐标,发送给服务器,服务器裁剪完再返回给用户,来回需要 ...
- HTML5裁剪图片并上传至服务器实现原理讲解
HTML5裁剪图片并上传至服务器实现原理讲解 经常做项目需要本地上传图片裁剪并上传服务器,比如会议头像等功能,但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁 ...
随机推荐
- 四种色彩模式ARGB_8888、ARGB_4444、 RGB_565、 ALPHA_8
A:透明度. R:红色. G:绿色. B:蓝色. Bitmap.Config ARGB_8888:有四个8位组成,A,R,G,B各占八位,也就是各占一个字节.也就是一个像素点占4个字节,32位. Bi ...
- Java 重写引入
1 package com.bytezero.override; 2 /* 3 * 方法的重新(override/overwrite) 4 * 5 * 1.重写:子类继承父类以后,可以对父类中同名同参 ...
- 十步带你用IDEA创建一个WEB项目及部署(Tomcat)
部署一个web项目首先需要安装Tomcat,还没安装的朋友们可以看一下我这个博客: https://www.cnblogs.com/deyo/p/17241878.html 第一步:打开Idea-新建 ...
- Java面试必考题之线程的生命周期,结合源码,透彻讲解!
写在开头 在前面的几篇博客里,我们学习了Java的多线程,包括线程的作用.创建方式.重要性等,那么今天我们就要正式踏入线程,去学习更加深层次的知识点了. 第一个需要学的就是线程的生命周期,也可以将之理 ...
- Python-使用openpyxl读取excel内容
1. 本篇文章目标 将下面的excel中的寄存器表单读入并构建一个字典 2. openpyxl的各种基本使用方法 2.1 打开工作簿 wb = openpyxl.load_workbook('test ...
- day09-Java数组
Java数组 9.稀疏数组 什么是稀疏数组? 当一个数组中大部分元素为0,或者为同一值的数组时,可以使用稀疏数组来保存该数组. 稀疏数组的处理方式是: 记录数组一共有几行几列,有多少个不同的值 把具有 ...
- 【At Coder begin 345】[D - Tiling] 回溯
题目链接:problem D 解法: 比较简单.看代码. import java.io.IOException; import java.io.InputStreamReader; import ja ...
- 初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法
初探修模的三维模型OBJ格式轻量化压缩的遇到常见问题与处理方法 在对经过修模的三维模型进行OBJ格式轻量化压缩处理的过程中,可能会遇到一些常见问题.以下是一些常见问题以及相应的处理方法: 1.顶点丢失 ...
- QGIS中下载遥感影像的Python代码片段
1. 引言 QGIS是开源免费且好用的GIS软件,并且可以使用Python脚本来控制 这里主要使用的打开QGIS时启动内置的Python解释器,这个Python解释器可以访问iface接口从而实现对Q ...
- TP6框架--CRMEB学习笔记:项目初始化+环境配置
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 最近在研究一个基于TP6的框架CRMEB,这里分享下我的开发心得 首先要获取原始项目文件 这里是git地址 https://gitee.c ...