springMVC结合Jcrop实现头像上传功能!头像上传以及之前预览再以及剪裁——javaweb版
springMVC结合Jcrop实现头像上传功能!头像上传以及之前预览再以及剪裁——javaweb版
火龙战士 发表于3年前
springMVC结合Jcrop实现头像上传功能!头像上传以及之前预览再以及剪裁——javaweb版
  • 发表于 3年前
  • 阅读 6186
  • 收藏 30
  • 点赞 6
  • 评论 16

新睿云服务器60天免费使用,快来体验!>>>   

摘要: 项目中有上传头像功能,需要对上传的图片进行截取,原来使用的是Flash插件上传,但是不可控制。最后看到这个Jcrop组件还不错,就尝试用了一下感觉还不错的!这里分享给大家

声明:这里的例子是项目剥离出来的,不完善,修订版(以及源码demo)传送门:

springMVC结合Jcrop实现头像上传裁剪预览功能--javaweb修订版

先说明下我搭建的环境是:springMVC+spring+mybatis ,由于表达能力欠缺。下面直接上代码:

一、jsp页面:

<form name="form" action="<%=request.getContextPath()%>/UploadDemo/uploadHeadImage" class="form-horizontal"
      method="post" enctype="multipart/form-data">
    <div class="modal-body text-center">
        <div class="zxx_main_con">
            <div class="zxx_test_list">
                <input class="photo-file" type="file" name="imgFile" id="fcupload" onchange="readURL(this);"/>
                <img alt="" src="" id="cutimg"/>
                <input type="hidden" id="x" name="x"/>
                <input type="hidden" id="y" name="y"/>
                <input type="hidden" id="w" name="w"/>
                <input type="hidden" id="h" name="h"/>
            </div>
        </div>
    </div>
    
    <div class="modal-footer">
        <button id="submit" onclick="">上传</button>
    </div>
</form>

二、jcrop组件引用情况:

    <link rel="stylesheet" href="<c:url value="/resources/uploadPlugin/css/jquery.Jcrop.css"/>" type="text/css"></link>
    <script type="text/javascript" src="<c:url value="/resources/uploadPlugin/scripts/jquery-1.8.3.js"/>"></script>
    <script type="text/javascript" src="<c:url value="/resources/uploadPlugin/scripts/jquery.Jcrop.js"/>"></script>

三、jcrop使用方法:(有两种,先说我使用的,最后在介绍两种方法的不同之处)

<script type="text/javascript">
      //定义一个全局api,这样操作起来比较灵活
        var api = null;
        function readURL(input) {
            if (input.files && input.files[0]) {
                var reader = new FileReader();
                reader.readAsDataURL(input.files[0]);
                reader.onload = function (e) {
                    $('#cutimg').removeAttr('src');
                    $('#cutimg').attr('src', e.target.result);
                    api = $.Jcrop('#cutimg', {
                        setSelect: [ 20, 20, 200, 200 ],
                        aspectRatio: 1,
                        onSelect: updateCoords
                    });
                };
                if (api != undefined) {
                    api.destroy();
                }
            }
            function updateCoords(obj) {
                $("#x").val(obj.x);
                $("#y").val(obj.y);
                $("#w").val(obj.w);
                $("#h").val(obj.h);
            };
        }
    </script>

四、后台代码:

    @RequestMapping(value = "/uploadHeadImage")
    public String uploadHeadImage(
            HttpServletRequest request,
            @RequestParam(value = "x") String x,
            @RequestParam(value = "y") String y,
            @RequestParam(value = "h") String h,
            @RequestParam(value = "w") String w,
            @RequestParam(value = "imgFile") MultipartFile imageFile
    ) throws Exception{
        System.out.println("==========Start=============");
        String realPath = request.getSession().getServletContext().getRealPath("/");
        String resourcePath = "resources/uploadImages/";
        if(imageFile!=null){
            if(FileUploadUtil.allowUpload(imageFile.getContentType())){
                String fileName = FileUploadUtil.rename(imageFile.getOriginalFilename());
                int end = fileName.lastIndexOf(".");
                String saveName = fileName.substring(0,end);
                File dir = new File(realPath + resourcePath);
                if(!dir.exists()){
                    dir.mkdirs();
                }
                File file = new File(dir,saveName+"_src.jpg");
                imageFile.transferTo(file);
                String srcImagePath = realPath + resourcePath + saveName;
                int imageX = Integer.parseInt(x);
                int imageY = Integer.parseInt(y);
                int imageH = Integer.parseInt(h);
                int imageW = Integer.parseInt(w);
                //这里开始截取操作
                System.out.println("==========imageCutStart=============");
                ImageCut.imgCut(srcImagePath,imageX,imageY,imageW,imageH);
                System.out.println("==========imageCutEnd=============");
            }
        }
        return "user/uploadImg/test";
    }

五、ImageCut.java工具类:

/**
     * 截取图片
     * @param srcImageFile  原图片地址
     * @param x    截取时的x坐标
     * @param y    截取时的y坐标
     * @param desWidth   截取的宽度
     * @param desHeight   截取的高度
     */
    public static void imgCut(String srcImageFile, int x, int y, int desWidth,
                              int desHeight) {
        try {
            Image img;
            ImageFilter cropFilter;
            BufferedImage bi = ImageIO.read(new File(srcImageFile+"_src.jpg"));
            int srcWidth = bi.getWidth();
            int srcHeight = bi.getHeight();
            if (srcWidth >= desWidth && srcHeight >= desHeight) {
                Image image = bi.getScaledInstance(srcWidth, srcHeight,Image.SCALE_DEFAULT);
                cropFilter = new CropImageFilter(x, y, desWidth, desHeight);
                img = Toolkit.getDefaultToolkit().createImage(
                        new FilteredImageSource(image.getSource(), cropFilter));
                BufferedImage tag = new BufferedImage(desWidth, desHeight,
                        BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.getGraphics();
                g.drawImage(img, 0, 0, null);
                g.dispose();
                //输出文件
                ImageIO.write(tag, "JPEG", new File(srcImageFile+"_cut.jpg"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

六、jcrop的两种使用方式:

1、jQuery('#cropbox').Jcrop({
                  onChange: showCoords,
                  onSelect: showCoords
           });

 

2、var api = $.Jcrop('#cropbox',{
                  onChange: showPreview,
                  onSelect: showPreview,
                  aspectRatio: 1
           });

这里推荐大家使用第二种方式,将Jcrop生成的对象赋给一个全局变量,这样操作起来更灵活,如调用api.destroy();方法可以销毁 Jcorp,这样我们在实际使用中会更灵活一些,因为直接改变要裁剪图片的路径会导致Jcorp的出错,如果想要变更编辑的图片我们需要销毁Jcorp, 变更图片的属性后再次为图片附加Jcorp。

参看:1、 jQuery Jcrop 图像裁剪  2、Jcrop的官网

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
火龙战士
粉丝 100
博文 116
码字总数 97754
评论 (16)
心有灵犀
支持,顶79
火龙战士

引用来自“心有灵犀”的评论

支持,顶79
O(∩_∩)O谢谢 第一分享 希望大家都喜欢~
陈lay
大神,FileUploadUtil这个类给一下呗
火龙战士

引用来自“陈lay”的评论

大神,FileUploadUtil这个类给一下呗
http://my.oschina.net/zhengweishan/blog/303663 这里有!很简单的!
金馆长1
点~猜猜我是谁~
火龙战士

引用来自“金某某”的评论

点~猜猜我是谁~
不用猜就知道是谁
huanyige
大神,请教一下form用enctype="multipart/form-data"时,@RequestParam(value = "x")怎么才能获得x的值
火龙战士

引用来自“huanyige”的评论

大神,请教一下form用enctype="multipart/form-data"时,@RequestParam(value = "x")怎么才能获得x的值
@RequestParam(value = "x") String x这样就可以了
ITDragon龙
第一步加jar包:
<!-- http://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
000
火龙战士

引用来自“白码非马”的评论

第一步加jar包:
<!-- http://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
000
606060
挡不住的小妖
大神,我按照你的方法去做啦,没有成功。能分享一个demo吗,让学习一下。邮箱:627314658@qq.com
火龙战士

引用来自“挡不住的小妖”的评论

大神,我按照你的方法去做啦,没有成功。能分享一个demo吗,让学习一下。邮箱:627314658@qq.com
已经加你好友~28
lynaaaaa
大神,麻烦你分享一个demo,邮箱:214506215@qq.com,万分感谢!!!
火龙战士

引用来自“lynaaaaa”的评论

大神,麻烦你分享一个demo,邮箱:214506215@qq.com,万分感谢!!!

http://git.oschina.net/zhengweishan/springmvc-jcrop
gistmap
==========Start=============
三月 30, 2017 2:04:05 下午 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/spring-jcrop] threw exception [Request processing failed; nested exception is java.lang.NumberFormatException: For input string: "NaN"] with root cause
java.lang.NumberFormatException: For input string: "NaN"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.lang.Integer.parseInt(Integer.java:492)
  at java.lang.Integer.parseInt(Integer.java:527)
  at com.springjcrop.demo.UploadImgController.uploadHeadImage(UploadImgController.java:41)

请看看
火龙战士

引用来自“gistmap”的评论

==========Start=============
三月 30, 2017 2:04:05 下午 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/spring-jcrop] threw exception [Request processing failed; nested exception is java.lang.NumberFormatException: For input string: "NaN"] with root cause
java.lang.NumberFormatException: For input string: "NaN"
  at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
  at java.lang.Integer.parseInt(Integer.java:492)
  at java.lang.Integer.parseInt(Integer.java:527)
  at com.springjcrop.demo.UploadImgController.uploadHeadImage(UploadImgController.java:41)

请看看
这是js传参出错了,你F12看下请求 这个传参是什么
×
火龙战士
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: