码迷,mamicode.com
首页 > Web开发 > 详细

刚完成的一个上传头像模块,望指点(含详细代码)

时间:2016-05-10 02:05:44      阅读:518      评论:0      收藏:0      [点我收藏+]

标签:

  file API,直接读取本地文件。fileAPIJCrop的结合使用上传头像。

  1html部分

  <input id="demo" type="file" name="file" onchange="showPic();"/>

  <img id="avatar" src="" style="width:200px">

  2fileAPI预览图片

  <script type="text/javascript">

  function showPic(){

    var file = $(‘#demo‘)[0].files[0];

    var reader = new FileReader();

    reader.onload = function(){//加载成功后会触发。reader.onloadend加载成功或失败都会触发

      $(‘#avatar‘).attr(‘src‘,reader.result);

    }

    reader.readAsDataURL(file);

  }

  </script>

  3JCrop截取图片工具

  <link rel="stylesheet" href="./JCrop/css/jquery.Jcrop.css" />

  <script src="./jquery-1.8.3.min.js" type="text/javascript"></script>

  //项目本身1.11有点问题,项目版本不支持,在下面再引用一遍1.8.2把之前版本覆盖,我试着是可以

  <script type="text/javascript" src="./JCrop/js/jquery.JCrop.min.js"></script>

  <script type="text/javascript">

  var Jcrop_api;

  function showPic(){

    var file = $(‘#demo‘)[0].files[0];

    var reader = new FileReader();

    reader.onloadend = function(){

      $(‘#avatar‘).attr(‘src‘,reader.result);

    }

    reader.readAsDataURL(file);

    var Jcrop_api = $.Jcrop($("#avatar"),{//初始化JCrop

      aspectRatio : 1 , //设置截图为正方形

      onChange: showCoords,//

      onSelect: showCoords

    });

  }

  function showCoords(coords){//预览裁剪效果,没详细写

    console.log(coords);//截图信息

  }

  </script>

  4、将图片和截取数据传往后台处理

  Jcrop的getScaleFactor()方法可以获取图片缩放比例[w,h]。但是我获取的一直是1:1,干脆不用了。

  往后台传数据用到两个东西,一个是formData,一个是xmlHttpRequest.

  var formData = new FormData;

  formData.append(‘file‘,$(‘#demo‘)[0].files[0]);

  formData.append(‘x‘,Jcrop_api.tellScaled().x);

  formData.append(‘y‘,Jcrop_api.tellScaled().y);

  formData.append(‘w‘,Jcrop_api.tellScaled().w);

  formData.append(‘h‘,Jcrop_api.tellScaled().h);//以上xywh四个值用来剪裁小图用的

  formData.append(‘showHeight‘,$(‘#avatar‘).style.height);//图片在页面的显示高度传到后台,用来计算图片的缩放比例

  xmlhttp = new XMLHttpRequest();

  xmlhttp.open("POST",url,true);

  xmlhttp.send();//就是一个ajax

  5、后台处理

  后台spring接收,用BufferedImage进行剪裁

  public void setAvatar(MultipartFile file,Integer x,Integer y,Integer w,Integer h,Integer showHeight){

    try {

      String suffix = file.getOriginalFilename().split(".")[file.getOriginalFilename().split(".").length-1];

      String avatarPath = "D:\\file\\"+UUID.randomUUID().toString().replaceAll("_","")+"."+suffix;

      BufferedImage bi = ImageIO.read(file.getInputStream());

      BigDecimal realHeight = new BigDecimal(bi.getHeight()+"");

      BigDecimal ratio = realHeight.divide(new BigDecimal(showHeight+""));

      x = ratio.multiply(new BigDecimal(x)).intValue();

      y = ratio.multiply(new BigDecimal(y)).intValue();

      w = ratio.multiply(new BigDecimal(w)).intValue();

      h = ratio.multiply(new BigDecimal(h)).intValue();

      BufferedImage newBi = bi.getSubimage(x, y, w, h);

      ImageIO.write(newBi, suffix, new File(avatarPath));

      /*

      *将可访问的头像文件路径赋值给用户实体

      */

      return "success";

    } catch (Exception e) {

      e.printStackTrace();

      return "error";

    }

  }

  6、遇到的问题

  页面在JS动态改变img的src属性后,img的宽度有时不能自适应(有时可以,有时不可以)。导致图片被拉伸变形,剪裁结果不准确。

  7、附Jcrop API

  参数:

 

名称

默认值

说明

allowSelect

true

允许新选框

allowMove

true

允许选框移动

allowResize

true

允许选框缩放

trackDocument

true

 

baseClass

“jcrop”

基础样式名前缀。说明:class=”jcrop-holder”,更改的只是其中的 jcrop。

addClass

null

添加样式。例:假设值为 “test”,那么会添加样式到

bgColor

“black”

背景颜色。颜色关键字、HEX、RGB 均可。

bgOpacity

0.6

背景透明度

bgFade

false

使用背景过渡效果

borderOpacity

0.4

选框边框透明度

handleOpacity

0.5

缩放按钮透明度

handleSize

9

缩放按钮大小

handleOffset

5

缩放按钮与边框的距离

aspectRatio

0

选框宽高比。说明:width/height

keySupport

true

支持键盘控制。按键列表:上下左右(移动)、Esc(取消)、Tab(跳出裁剪框,到下一个)

cornerHandles

true

允许边角缩放

sideHandles

true

允许四边缩放

drawBorders

true

绘制边框

dragEdges

true

允许拖动边框

fixedSupport

true

 

touchSupport

null

 

boxWidth

0

画布宽度

boxHeight

0

画布高度

boundary

2

边界。说明:可以从边界开始拖动鼠标选择裁剪区域

fadeTime

400

过度效果的时间

animationDelay

20

动画延迟

swingSpeed

3

过渡速度

minSelect

[0,0]

选框最小选择尺寸。说明:若选框小于该尺寸,则自动取消选择

maxSize

[0,0]

选框最大尺寸

minSize

[0,0]

选框最小尺寸

onChange

function(){}

选框改变时的事件

onSelect

function(){}

选框选定时的事件

onRelease

function(){}

取消选框时的事件

  方法:

  

名称

说明

setImage(string)

设定(或改变)图像。例:jcrop_api.setImage("newpic.jpg")

setOptions(object)

设定(或改变)参数,格式与初始化设置参数一样

setSelect(array)

创建选框,参数格式为:[x,y,x2,y2]

animateTo(array)

用动画效果创建选框,参数格式为:[x,y,x2,y2]

release()

取消选框

disable()

禁用 Jcrop。说明:已有选框不会被清除。

enable()

启用 Jcrop

destroy()

移除 Jcrop

tellSelect()

获取选框的值(实际尺寸)。例子:console.log(jcrop_api.tellSelect())

tellScaled()

获取选框的值(界面尺寸)。例子:console.log(jcrop_api.tellScaled())

getBounds()

获取图片实际尺寸,格式为:[w,h]

getWidgetSize()

获取图片显示尺寸,格式为:[w,h]

getScaleFactor()

获取图片缩放的比例,格式为:[w,h]

网上有些版本的jquery.JCrop.min.js文件中不包含这个方法,重新下载一个完成版

 

 

刚完成的一个上传头像模块,望指点(含详细代码)

标签:

原文地址:http://www.cnblogs.com/dwding/p/5475998.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!