spring-mvc整合jquery cropper图片裁剪插件

23 篇文章 0 订阅
9 篇文章 0 订阅

spring-mvc整合jquery cropper图片裁剪插件

由于项目需要,最近两天都在研究sprigmvc整合jquery一款非常好用的图片裁剪插件---cropper。

在网上查找借鉴了一些资料,最终实现了效果。源代码下载地址: http://download.csdn.net/detail/u012759397/9679445

  • - (1) cropper.jsp(以下代码所需js和css可以去github上下载cropper-master.rar):
 <link rel="stylesheet" href="<%=path %>/resources/cropper/css/bootstrap.min.css">
  <link rel="stylesheet" href="<%=path %>/resources/cropper/css/cropper.min.css">
  <link rel="stylesheet" href="<%=path %>/resources/cropper/css/main.css">
  <script src="<%=path %>/resources/cropper/js/jquery.min.js"></script>
  <script src="<%=path %>/resources/cropper/js/bootstrap.min.js"></script>
  <script src="<%=path %>/resources/cropper/js/cropper.min.js"></script>
  <script src="<%=path %>/resources/cropper/js/main.js"></script>
<body>
  <div class="container" id="crop-avatar">
    <!-- Current avatar -->
    <div class="avatar-view" title="Change the avatar">
      <img src="<%=path %>/resources/cropper/img/picture.jpg" alt="Avatar">
    </div>
    <!-- Cropping modal -->
    <div class="modal fade" id="avatar-modal" aria-hidden="true" aria-labelledby="avatar-modal-label" role="dialog" tabindex="-1">
      <div class="modal-dialog modal-lg">
        <div class="modal-content">
          <form class="avatar-form" action="uploadHeadImage" enctype="multipart/form-data" method="post" accept="image/*">
            <div class="modal-header">
              <button type="button" class="close" data-dismiss="modal">&times;</button>
              <h4 class="modal-title" id="avatar-modal-label">更改封面</h4>
            </div>
            <div class="modal-body">
              <div class="avatar-body">
                <div class="avatar-upload">
                  <input type="hidden" class="avatar-src" name="avatar_src">
                  <input type="hidden" class="avatar-data" name="avatar_data">
                  <label for="avatarInput" class="btn btn-primary">选择图片</label>
                  <input type="file" class="avatar-input" id="avatarInput" name="avatar_file" style="display: none;" accept="image/*">
                </div>
                <!-- Crop and preview -->
                <div class="row">
                  <div class="col-md-9">
                    <div class="avatar-wrapper"></div>
                  </div>
                  <div class="col-md-3">
                    <div class="avatar-preview preview-lg"></div>
                    <div class="avatar-preview preview-md"></div>
                    <div class="avatar-preview preview-sm"></div>
                  </div>
                </div>
                <div class="row avatar-btns">
                  <div class="col-md-9">
                    <div class="btn-group">
                     <button type="button" class="btn btn-primary" data-method="rotate" data-option="90" title="Rotate 90 degrees">旋转图片</button>
                      <button type="button" class="btn btn-primary" data-method="rotate" data-option="15">15deg</button>
                      <button type="button" class="btn btn-primary" data-method="rotate" data-option="30">30deg</button>
                      <button type="button" class="btn btn-primary" data-method="rotate" data-option="45">45deg</button>
                    </div>
                  </div>
                  <div class="col-md-3">
                    <button type="submit" class="btn btn-primary btn-block avatar-save">提交</button>
                  </div>
                </div>
              </div>
            </div>
            <!-- <div class="modal-footer">
              <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
            </div> -->
          </form>
        </div>
      </div>
    </div><!-- /.modal -->

    <!-- Loading state -->
    <div class="loading" aria-label="Loading" role="img" tabindex="-1"></div>
  </div>
</body>
  • (2)后台UploadImgController.java
@Controller
@RequestMapping("/UploadDemo")
public class UploadImgController {

    @RequestMapping(value = "/uploadHeadImage",method = RequestMethod.GET)
    public String uploadCropper(){
        return "cropper";
    }

    @RequestMapping(value = "/uploadHeadImage",method = RequestMethod.POST, produces="text/html;charset=utf-8")
    @ResponseBody  
    public String uploadCropper(
            @RequestParam(value = "avatar_file",required=false) MultipartFile avatar_file,
             String avatar_src,String avatar_data, HttpServletRequest request) {
                System.out.println("==========Start=============");
                String realPath = request.getSession().getServletContext().getRealPath("/");
                String resourcePath = "/upload/image/";
                //判断文件的MIMEtype
                String type = avatar_file.getContentType();
                if(type==null || !FileUploadUtil.allowUpload(type)) return  JSON.toJSONString(new Result(null,"不支持的文件类型,仅支持图片!"));
                System.out.println("file type:"+type);
                String fileName = FileUploadUtil.rename(avatar_file.getOriginalFilename());
                int end = fileName.lastIndexOf(".");
                String saveName = fileName.substring(0,end);
                try {
                    File dir = new File(realPath + resourcePath);
                    if(!dir.exists()){
                        dir.mkdirs();
                    }
                    File file = new File(dir,saveName+"_src.jpg");
                    avatar_file.transferTo(file);
                } catch (Exception e) {
                    e.printStackTrace();  
                    return  JSON.toJSONString(new Result(null,"上传失败,出现异常:"+e.getMessage()));
                }   
                String srcImagePath = realPath + resourcePath + saveName;
                JSONObject joData = (JSONObject) JSONObject.parse(avatar_data);
                // 用户经过剪辑后的图片的大小  
                float x = joData.getFloatValue("x");
                float y = joData.getFloatValue("y");
                float w =  joData.getFloatValue("width");
                float h =  joData.getFloatValue("height");
                float r = joData.getFloatValue("rotate");
                //这里开始截取操作
                System.out.println("==========imageCutStart=============");
                ImgCut.cutAndRotateImage(srcImagePath, (int)x,(int) y,(int) w,(int) h,(int) r);
                System.out.println("==========imageCutEnd=============");            

        return  JSON.toJSONString(new Result(request.getSession().getServletContext().getContextPath()+resourcePath+saveName+"_cut.jpg","上传成功!"));
  }
}
  • (3)以上代码运行,在提交图片的时候用火狐的FireBug查看上传已成功,并且裁剪后的图片也存放在了项目路径下,但是页面会报Failed to response.

经过多次检查,在main.js中发现了问题.
原因就是当我上传图片成功后,后台会返回一个json串,由以下可知:
data: data,dataType: ‘json’, 知道,之后就会执行 :

 success: function (data) {
      _this.submitDone(data);
 }
 submitDone: function (data) {
      console.log(data);

      if ($.isPlainObject(data) && data.state === 200) {
        if (data.result) {
          this.url = data.result;

          if (this.support.datauri || this.uploaded) {
            this.uploaded = false;
            this.cropDone();
          } else {
            this.uploaded = true;
            this.$avatarSrc.val(this.url);
            this.startCropper();
          }

          this.$avatarInput.val('');
        } else if (data.message) {
          this.alert(data.message);
        }
      } else {
        this.alert('Failed to response');
      }
    },

此时由以上js中的源代码可以知道问题就在此处.但是图片上传没问题,在项目路径下也可以找到裁剪后的图片,那么怎么会响应失败?百思不得其解。
又经过反复检查,最终用firebug调试,找出了问题。data.state === 200,没错就是这里的问题,在firebug下,返回的json串提示上传图片已经成功!但是并没有出现200 ok,于是我就把data.state === 200删除,在运行代码。没问题了。。。

  • (4)代码运行效果展示

上传的原图
上传之后的图片

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值