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

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

  1、html部分

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

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

  2、fileAPI预览图片

  <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>

  3、JCrop截取图片工具

  <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文件中不包含这个方法,重新下载一个完成版

时间: 2024-12-24 03:15:09

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

Jcrop+uploadify+php实现上传头像预览裁剪

最近由于项目需要,所以做了一个上传头像预览并且可以预览裁剪的功能,大概思路是上传的图片先保存到服务器,然后通过ajax从服务器获取到图片信息,再利用Jcrop插件进行裁剪,之后通过PHP获取到的四个裁切点的坐标进行裁剪. 首先看一下uploadify上传插件的API: uploader : uploadify.swf 文件的相对路径,该swf文件是一个带有文字BROWSE的按钮,点击后淡出打开文件对话框,默认值:uploadify.swf.script :   后台处理程序的相对路径 .默认值:

Discuz!NT Flash无法上传头像,点击上传后无任何反应

最近在对一个Discuz!NT论坛的老项目进行维护和二次开发,遇到了论坛无法上传头像的问题.在网上找了相当多的资料,发现解决的方法基本是无效的.虽然有的状况一样,但是没有解决方法,后来自己研究了下也总算是解决了这个问题. 首先说明下出现无法上传头像的具体症状,大概的症状有下面这几点: 使用Flash头像上传时,点击上传图片,然后显示“图片载入中,请稍后的提示信息”和上传进度的百分比,最后却是没有任何的反应. 网上有部分网友说到进度到10%就没有任何反应,其实只是部分情况,如果传大图片的话会显示其

Android基础之——startActivityForResult启动界面并返回数据,上传头像

在android应用的开发过程中,经常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程.在很多应用程序的模块中,都有"我的"这个模块,在未登录状态下点击其中的某一项,就会弹出登录界面,登录完成后回到我的界面,会显示一些登录后的数据,这个功能的实现就要用到startActivityForResult. 下面通过一个小demo来说明一下startActivityForResult的使用,以及在实际开发中的一些应用. demo的效果图如下: 主界面布局:

file API+JCrop 选择、裁剪并上传头像

file API,直接读取本地文件,绕过了后台处理再返回前台的过程,使编程更简单.fileAPI和JCrop的结合使用上传头像. 1.html部分 <input id="demo" type="file" onchange="showPic();"/> <img id="avatar" src=""> 2.fileAPI预览图片(jquery) <script type=&qu

[实战]MVC5+EF6+MySql企业网盘实战(4)——上传头像

写在前面 最近又开始忙了,工期紧比较赶,另外明天又要去驾校,只能一个功能一个功能的添加了,也许每次完成的功能确实不算什么,等将功能都实现了,然后在找一个好点的ui对前端重构一下. 系列文章 [EF]vs15+ef6+mysql code first方式 [实战]MVC5+EF6+MySql企业网盘实战(1) [实战]MVC5+EF6+MySql企业网盘实战(2)——用户注册 [实战]MVC5+EF6+MySql企业网盘实战(3)——验证码 [实战]MVC5+EF6+MySql企业网盘实战(4)—

flask 上传头像

上传头像,自己感觉了好久,就是上传文件呗其实,存在一个路径,数据库存储这个路径,然后展示给前端,啥都不说,看怎么实现的. 数据库设置如下 user_image=db.Column(db.String(252),nullable=True) form 表单设计: avatar=FileField('头像') 后端实现代码 avatar=request.files['avatar'] fanme=avatar.filename upfile=os.getcwd()+('/app/static/ava

Flask blog实战---上传头像功能

第一步:数据库的表单中新增用户头像这一字段models.py中 第二步:在编辑资料的表单中增加头像上传, avatar = FileField('头像') 第三步:在编辑资料的路由界面,添加用户提交头像的功能,参考博客 http://ncitycode.com/python/flask/2016/6/18/ UPLOAD_FOLDER = current_app.config['UPLOAD_FOLDER'] 这里我在config.py中设置的文件上传路径为 将数据库中头像存储的路径修改为 到这

总结今天项目上传头像中遇到的问题

由于公司需要,在做项目的时候,涉及到上传头像的部分,在php中,上传图片是一种很简单的事情.但是需要实现仿QQ,新浪需要对图片截取图片,就不那么容易,我采取的是canvas获取getDataURL,然后将数据通过ajax发送到后台服务器并保存到数据库中再通过img的src属性进行读取数据库中的数据,在展现出来,但是因为项目中有留言板,这里会出现一个问题,就是图片保存为base64数据虽然可以减小一次http请求但是重要的事情说三遍,只对于小图片可以,将大图片的getDataURL存取在数据库中,

完美实现类似QQ的自拍头像、上传头像功能!(Demo 源码)

现在很多下载客户端程序都需要设定自己头像的功能,而设定头像一般有两种方式:使用摄像头自拍头像,或者选择一个图片的某部分区域作为自己的头像. 一.相关技术 若要实现上述的自拍头像和上传头像的功能,会碰到以下要解决的问题: (1)调用摄像头,捕获摄像头采集的视频,并将采集的视频绘制到UI上. (2)从图片文件读取Image,并显示在控件上(这个相当easy). (3)在显示的视频或图片上,能够拖动一个正方形,以选择指定部分的区域作为自己的头像. (4)从视频中截获一帧保存为图片. (5)从图片中截取