文档章节

springMVC结合Jcrop实现头像上传功能!头像上传以及之前预览再以及剪裁——javaweb版

火龙战士
 火龙战士
发布于 2015/01/16 09:57
字数 853
阅读 6728
收藏 30

声明:这里的例子是项目剥离出来的,不完善,修订版(以及源码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的官网

© 著作权归作者所有

共有 人打赏支持
火龙战士

火龙战士

粉丝 113
博文 131
码字总数 99427
作品 0
北京
后端工程师
加载中

评论(17)

zjwsnow
zjwsnow
大神,我按照你的方法去做啦,没有成功。能分享一个demo吗 谢谢
火龙战士
火龙战士

引用来自“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看下请求 这个传参是什么
gistmap
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)

请看看
火龙战士
火龙战士

引用来自“lynaaaaa”的评论

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

http://git.oschina.net/zhengweishan/springmvc-jcrop
l
lynaaaaa
大神,麻烦你分享一个demo,邮箱:214506215@qq.com,万分感谢!!!
火龙战士
火龙战士

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

大神,我按照你的方法去做啦,没有成功。能分享一个demo吗,让学习一下。邮箱:627314658@qq.com
已经加你好友~28
挡不住的小妖
挡不住的小妖
大神,我按照你的方法去做啦,没有成功。能分享一个demo吗,让学习一下。邮箱:627314658@qq.com
火龙战士
火龙战士

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

第一步加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
ITDragon龙
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
火龙战士
火龙战士

引用来自“huanyige”的评论

大神,请教一下form用enctype="multipart/form-data"时,@RequestParam(value = "x")怎么才能获得x的值
@RequestParam(value = "x") String x这样就可以了
springMVC结合Jcrop实现头像上传裁剪预览功能--javaweb修订版

原地址:springMVC结合Jcrop实现头像上传功能!头像上传以及之前预览再以及剪裁——javaweb版 此处博客写的不是很完善,是我抽取了项目的一部分贴了出来,没有全部给出源码,可能小伙伴自己建...

火龙战士
2016/06/25
2.6K
3
Python综合Web案例_在线为头像添加装饰

前几天元旦, 用Python为自家公众号做了一个"革面"的活动页面,活动的效果非常好,分享一下实现过程: 前端: BootStrap, Jquery, Jcrop 后端: Django, Pillow 第一步: 选择头像 初始页面 这是一个...

木子昭
01/03
0
0
pumelo/WebHeadPicker

#WebHeadPicker #Web头像拾取器插件 在网上找了一段时间,总的来说,cropper比较好。本项目基于cropper,以及一些互联网资源。 您是否应该使用本项目?如果您需要把头像直接上传到阿里云OSS...

pumelo
2017/05/20
0
0
flash上传头像剪裁预览组件_头像上传插件

自己网站需要用到 头像上传剪切 自己找了一下 找到了一个flash上传头像插件 看效果不错 但是还收费,之后又慢慢搜索,找到了一个已经开源的 , 对比一下 之前收费的那个就是 拿着这个 修改 ...

天空下的
2014/06/27
0
2
flash上传头像剪裁预览组件 2.1 版本发布了

flash上传头像剪裁预览组件 2.1 发布了,此版本现已提供下载: 下载地址 : http://www.hdfu.net/down.html 更新内容如下: 解决 flash 13 以上版本,点击 "本地上传图片" 失败bug 新增加 ss...

easymvc
2014/12/01
3.3K
68

没有更多内容

加载失败,请刷新页面

加载更多

等语句含义

经常会看到某些网站的框架中会用到 <!--[if IE7]><![endif]--> 等语句,今天特意查阅了下它们的区别: <!--[if IE]>所有的IE可识别<![end if]--><!--[if !IE]>除IE外都能识别<![end if]-->......

度_
13分钟前
0
0
资源的有限性与任务的复杂性之间的矛盾

看了一篇文章How to Manage Connections Efficiently in Postgres, or Any Database, 文章讨论了如何管理Postgres数据库连接,列举了几种方式: 每个请求一个连接 连接复用 连接池 连接池管理...

52iSilence7
13分钟前
1
0
Python PEP8规范整理

PEP8规范总结 PEP8 是什么呢,简单说就是一种编码规范,是为了让代码“更好看”,更容易被阅读。 具体有这些规范,参考 PEP 8 --Style Guide for Python Code.当然也可以使用Pycharm检查或使...

_Change_
25分钟前
0
0
input去空格

货币转换while True:MonStr = input()if MonStr[:3] == "RMB":USD = eval(MonStr[3:])/6.78print("USD{:.2f}".format(USD))elif MonStr[:3] == "USD":RMB = eval(MonStr[3:......

fadsaa
28分钟前
0
0
单例设计模式

单例设计模式 设计模式介绍与代码编写 在编写程序时经常会遇到一些典型的问题或需要完成某种特定需求.设计模式就是针对这些问题和需求.在大量的实践中总结和理论化之后的代码结构.编程风格以...

码农屌丝
29分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部