上传图片并裁剪(cropper),ajax上传base64(裁剪后的图片)

xiaoxiao2021-02-28  35

本次采用的是cropper裁剪

一、需引入文件

<link rel="stylesheet" href="scripts/cropper/cropper.css" />

<script src="scripts/cropper/jquery.min.js"></script>

<script src="scripts/cropper/cropper.js"></script>

此处需注意的是,必须先引入jquery.min.js,再引入cropper.js,否则会出现错误.cropper()函数未定义,我猜想cropper.js是基于jquery写的

二、元素

<!-- 调用选择图片,并将图片的值传到后台 --> <input type="file" style="display: none;"     id="PRODUCT_PIC" name="PRODUCT_PIC" value="" οnchange="selectImage(this)"> <!-- 图片点击与显示 --> <div style="width:500px;height: 800px;display:inline;" id="cropper1">     <img οnclick="selectclick()" src="<%=touxiang%>/${DATE}/${pd.PRODUCT_PIC}" style="height: 800px; width: 500px; cursor: pointer;" id="img"/> </div> <!-- 图片裁剪 --> <div style="width:500px;height: 800px; display: none" id="cropper2">     <img src="" style="height: 800px; width: 500px; cursor: pointer;" id="cropper"/>     <button id="image_save" >保存</button> </div> 

三、js代码

//点击图片,调用input上传图片的功能 function selectclick() {     document.getElementById("PRODUCT_PIC").click(); } //上传图片 function selectImage(file) {     debugger;     if (!file.files || !file.files[0]) {         return;     }     var reader = new FileReader();     //上传图片成功的回调     reader.onload = function(evt) { $('#cropper1').hide(); $('#cropper2').show(); //调用cropper.js中的方法出现裁剪区,evt.target.result是的到的图片的src,传入下面的函数中 $('#cropper').cropper('reset', true).cropper('replace', evt.target.result); }     reader.readAsDataURL(file.files[0]);//将信息存入input } //裁剪区格式的设定 $('#cropper').cropper({     viewMode: 1,     aspectRatio: 1, //裁剪比例,NaN-自由选择区域     autoCropArea: 0.9, //初始裁剪区域占图片比例     aspectRatio: 500 / 800,     resizable:false,//不允许改变裁剪框大小     dragCrop:false,//不允许重开裁剪框     // movable:false,//不允许移动裁剪框     crop: function(data) { //裁剪操作回调     } }); //图片显示 $('#image_save').click(function(e) {         debugger;             e.preventDefault();//阻止整个页面的表单提交             var canVas = $('#cropper').cropper("getCroppedCanvas", {});             //将裁剪的图片加载到face_image             $('#img').attr('src', canVas.toDataURL());             //去除base64的data:image/png;base64,             eImgBase64 = canVas.toDataURL().substring(22);             $.ajax({ type: "POST", url: '<%=basePath%>/product/cropper.do', data: {touxiang:eImgBase64}, success: function(data){ $("#Form").append("<input type='hidden' name='pic0' value='"+data+"'/>"); } });              $('#cropper2').hide(); $('#cropper1').show();         });

需要注意的是:

1、canVas.toDataURL()的到的是base64的字符串(格式:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAALYAAAEjCAYAAACfLPtAAAAgAElEQVR4Xny9WZBl13Ultu785nw5j5U1zxMKqAKKBAoEQIiTSFGkqOi25T9/2P6yI+SOkNTqcITD/nHbH/7oD0tid....),如果是在前端展示,直接将其赋值给'src',如果传送给controller去处理,必须把data:image/png;base64,上传方式必须用post

2、有可能会出现http post request header is too large问题,部署时需要修改server.xml

3、<%=basePath%>代表项目路径

三、controller层的代码

'<%=basePath%>product/cropper.do'方法的作用是,将接收base64图片,将其存入本地,返回ajax一个图片地址,

        /**图片裁剪存储 * @param touxiang * @throws Exception */ @RequestMapping(value="/cropper") @ResponseBody public String cropper() throws Exception{ PageData pd = this.getPageData();// 获取post+get的参数 String touxiang =""; try{ //必传参数的非空判断 if (null != pd.getString("touxiang") && !"".equals(pd.getString("touxiang"))) { //存储头像的名称 touxiang = this.get32UUID()+".png"; //对字节数组字符串进行Base64解码并生成图片 String a = pd.getString("touxiang");//传入的base64 boolean generateImage = ImageAnd64Binary.generateImage(a, Image.getBASICPATH()+Image.getPATHPIC() + "/" + touxiang); System.out.println(Image.getImageTou1()+touxiang); } }catch(Exception e){ logger.info("图片裁剪异常:" + e.getMessage()); } logAfter(logger, "图片裁剪结束"); return Image.getBASICPATH()+Image.getPATHPIC() + "/" + touxiang;     }

generateImage方法:对字节数组字符串进行Base64解码并生成图片

该方法的第一个参数是base64字符串,第二个是存入的路径

/** * 对字节数组字符串进行Base64解码并生成图片 * @param imgStr 转换为图片的字符串 * @param imgCreatePath 将64编码生成图片的路径 * @return */ public static boolean generateImage(String imgStr, String imgCreatePath){ if (imgStr == null) //图像数据为空 return false; BASE64Decoder decoder = new BASE64Decoder(); try { //Base64解码 byte[] b = decoder.decodeBuffer(imgStr); for(int i=0;i<b.length;++i) { if(b[i]<0) {//调整异常数据 b[i]+=256; } } OutputStream out = new FileOutputStream(imgCreatePath); out.write(b); out.flush(); out.close(); return true; } catch (Exception e){ return false; } }

转载请注明原文地址: https://www.6miu.com/read-2299975.html

最新回复(0)