最近使用laravel的时,候想实现用户上传头像,并自定义区域裁剪的功能;查了一些资料基本上都是Jcorp+uplodify+PHP的方法实现的;于是做了demo,也基本上实现了功能,郁闷的事,在结合laravel的时候uplodify上传302错误码,按照网页的方法传递session_id,也不见生效,后来改用ajaxupload完美实现了这个功能,特此记录:


final效果图:








代码:


  /**
     * 上传头像
     */
    public function upload(){

          $path = app_path()."/../public/avatar/";
          $tmpath="/avatar/";

         if(!empty($_FILES)){

            //得到上传的临时文件流
            $tempFile = $_FILES['myfile']['tmp_name'];

            //允许的文件后缀
            $fileTypes = array('jpg','jpeg','gif','png');

            //得到文件原名
            $fileName = iconv("UTF-8","GB2312",$_FILES["myfile"]["name"]);
            $fileParts = pathinfo($_FILES['myfile']['name']);



            //最后保存服务器地址
            if(!is_dir($path)){
                mkdir($path);
            }

            if (move_uploaded_file($tempFile,$path.$fileName)){
                $info= $tmpath.$fileName;
                $status=1;
                $data=array('path'=>app_path(),'file'=> $path.$fileName);
            }else{
                $info=$fileName."上传失败!";
                $status=0;
                $data='';
            }
             echo $info;
        }
    }


     /**
      * @裁剪头像
      */

    public function cutPic(){
        if(Request::ajax()){
            $path="/avatar/";
            $targ_w = $targ_h = 150;
            $jpeg_quality = 100;
            $src = Input::get('f');
            $src=app_path().'/../public'.$src;//真实的图片路径

            $img_r = imagecreatefromjpeg($src);
            $ext=$path.time().".jpg";//生成的引用路径
            $dst_r = ImageCreateTrueColor( $targ_w,$targ_h );

            imagecopyresampled($dst_r,$img_r,Input::get('x'),Input::get('y'),$targ_w,$targ_h,Input::get('w'),Input::get('h'));

            $img=app_path().'/../public'.$ext;//真实的图片路径

            if(imagejpeg($dst_r,$img,$jpeg_quality)){

                $arr['status']=1;
                $arr['data']=$ext;
                $arr['info']='裁剪成功!';
                echo json_encode($arr);

            }else{
                $arr['status']=0;
                echo json_encode($arr);
            }
            exit;
        }
    }



前端代码:


<!DOCTYPE html>
<html>
<head lang="en">
    <Meta charset="UTF-8">
    <title>register</title>
    {{HTML::script('js/jquery.js')}}
     {{HTML::script('js/ajaxupload.js')}}
     {{HTML::script('js/jquery.Jcrop.min.js')}}
    {{HTML::style("css/index.css")}}
    {{HTML::style("css/jquery.Jcrop.css")}}
</head>
<style type="text/css">
 .form{padding: 15px;}
  .jcorp-holder{position: relative;}
  #frm{margin-bottom:0px; }
  #frm input{margin:15px 0; }
 .pic-display{display: block;margin: 20px;width: auto;}
 #thum{width: auto;}
 /*#thum img{width: auto;height: auto;display: block;}*/
 #preview-pane{
  width:150px;
  height: 150px;
  display: block;
  position: absolute;
  z-index: 2000;
  top: 10px;
  right:-170px;
  padding: 6px;
  border: 1px rgba(0,.4) solid;
  background-color: white;

  -webkit-border-radius: 6px;
  -moz-border-radius: 6px;
  border-radius: 6px;

  -webkit-Box-shadow: 1px 1px 5px 2px rgba(0,0.2);
  -moz-Box-shadow: 1px 1px 5px 2px rgba(0,0.2);
  Box-shadow: 1px 1px 5px 2px rgba(0,0.2);
}

#preview-pane .preview-container {
  width: 150px;
  height: 150px;
  overflow: hidden;
  padding: 0;
}
.jcrop-preview{padding: 0;margin: 0}



</style>
<body>
    <div class="main">
       <div class="top_nav">
                       <div class="top_nav_l"> <b class="index"></b>网站后台 <span>/</span><a href="/articles">首页</a><span>/</span>修改头像</div>
                       <div class="top_nav_r"> {{link_to_route('logout','退出')}}</div>
                       <div style="clear:both"></div>
       </div>

        <div class="content">
                 <div class="form">
                  <h3>头像上传:</h3>

                    <form id="frm" action="#" method="post">
                          <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" />
                          <input type="hidden" id="f" name="f" />

                          <input id='upload' name="file_upload" type="button" value='上传' class='btn btn-large btn-primary'>
                          <input type="button" name="btn" value="确认裁剪" class="btn" />

                    </form>
                     <div class="info"></div>
                     <div class="pic-display"></div><div class="text-info"></div>

                 </div>
        </div>

    </div>

    <script>
                         var url="http://"+window.location.host;
                         var g_oJCrop = null;
                        //异步上传文件
                         new AjaxUpload("#upload",{
                                  action: url+'/user/upload',type:"post",name:'myfile',data: {},onSubmit: function(file,ext) {
                                     if($(".text-info img").length>0){
                                         $(".info").html("<div style='color:#E3583B;margin:5px;'>文件已经裁剪过!</div>");return false;
                                     }
                                     $(".info").html("<div style='color:#008000;margin:5px;'>上传中...</div>");
                                  },onComplete: function(file,response) {

                                        if(g_oJCrop!=null){g_oJCrop.destroy();}
                                       //生成元素
                                       $(".pic-display").html("<div class='thum'><img id='target' src='"+response+"'/></div>");

                                        //初始化裁剪区
                                        $('#target').Jcrop({
                                          onChange: updatePreview,onSelect: updatePreview,aspectRatio: 1
                                        },function(){
                                          g_oJCrop = this;

                                          var bounds = g_oJCrop.getBounds();
                                          var x1,y1,x2,y2;
                                      if(bounds[0]/bounds[1] > 150/150)
                                      {
                                        y1 = 0;
                                        y2 = bounds[1];

                                        x1 = (bounds[0] - 150 * bounds[1]/150)/2;
                                        x2 = bounds[0]-x1;
                                      }
                                      else
                                      {
                                        x1 = 0;
                                        x2 = bounds[0];

                                        y1 = (bounds[1] - 150 * bounds[0]/150)/2;
                                        y2 = bounds[1]-y1;
                                      }
                                      g_oJCrop.setSelect([x1,y2]);

                                       //顺便插入略缩图
                                       $(".jcrop-holder").append("<div id='preview-pane'><div class='preview-container'><img  class='jcrop-preview' src='"+response+"' /></div></div>");

                                      });
                                       //传递参数上传
                                       $("#f").val(response);

                                       //更新提示信息
                                       $(".info").html("<div style='color:#008000;margin:5px;'>准备裁剪。。。</div>");

                                  }
                              });

                        //更新裁剪图片信息
                              function updatePreview(c) {
                                if (parseInt(c.w) > 0){
                                      $('#x').val(c.x);
                                      $('#y').val(c.y);
                                      $('#w').val(c.w);
                                      $('#h').val(c.h);
                                        var bounds = g_oJCrop.getBounds();
                                        var rx = 150 / c.w;
                                        var ry = 150 / c.h;
                                    $('.preview-container img').css({
                                      width: Math.round(rx * bounds[0]) + 'px',height: Math.round(ry * bounds[1]) + 'px',marginLeft: '-' + Math.round(rx * c.x) + 'px',marginTop: '-' + Math.round(ry * c.y) + 'px'
                                    });
                                }
                              }


                            //表单异步提交后台裁剪

                                $("input[name=btn]").click( function(){
                                        var w=parseInt($("#w").val());
                                        if(!w){
                                            w=0;
                                        }
                                        if(w>0){
                                             $.post(url+'/user/cutPic',{'x':$("input[name=x]").val(),'y':$("input[name=y]").val(),'w':$("input[name=w]").val(),'h':$("input[name=h]").val(),'f':$("input[name=f]").val()},function(data){
                                                if(data.status==1){
                                                    $(".pic-display").remove();
                                                    $(".info").html("<div style='color:#008000;margin:10px 5px;'>裁剪成功!</div>")
                                                    $(".text-info").html("<img src='"+data.data+"'>");
                                                    $("input[name=btn]").hide();
                                                }

                                        },'json');
                                        }else{
                                            $(".info").html("<div style='color:#E3583B;margin:5px;'>亲!还没有选择裁剪区域哦!</div>");
                                        }
                                      });

    </script>
</body>
</html>

laravel博客开发之利用jcorp结合laravel和ajaxupload实现用户头像上传和裁剪功能的更多相关文章

  1. HTML5 input新增type属性color颜色拾取器的实例代码

    type 属性规定 input 元素的类型。本文较详细的给大家介绍了HTML5 input新增type属性color颜色拾取器的实例代码,感兴趣的朋友跟随脚本之家小编一起看看吧

  2. 移动HTML5前端框架—MUI的使用

    这篇文章主要介绍了移动HTML5前端框架—MUI的使用的相关资料,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

  3. 使用placeholder属性设置input文本框的提示信息

    这篇文章主要介绍了使用placeholder属性设置input文本框的提示信息,本文给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下

  4. Bootstrap File Input文件上传组件

    这篇文章主要介绍了Bootstrap File Input文件上传组件,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  5. HTML5中input输入框默认提示文字向左向右移动的示例代码

    这篇文章主要介绍了HTML5中input输入框默认提示文字向左向右移动,本文通过实例代码给大家介绍的非常详细对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

  6. swift 正则表达式运用实例选自《swifter 100个swift开发必备tip 》

  7. Swift 2.0关键字guard

    viewmode=list前言:当一项新的技术出来的时候,第一参考自然是文档。文档链接guard语句guard语句的作用是:当某些条件不满足的情况下,跳出作用域举个例子:写个函数,保证输入小于10在playground输入如下可以看到输出上述方法和使用if一样但是使用guard有一个好处如果不使用return,break,continue,throw跳出当前作用域,编译器会报错所以,对那些对条件要求十分严格的地方,guard是不二之选。另外,guard也可以使用可选绑定也就是guardlet的格式例如如何

  8. Swift 柯里化(currying)和反柯里化(uncurrying)

    //DemoofcurryingfuncaddTwoNums(a:Int)(num:Int)->Int{returna+num}letaddToFour=addTwoNums(4)letresult=addToFour(num:6)print("result:\(result)")funcgreaterThan(comparor:Int)(input:Int)->Bool{returninput>

  9. swift – 上下文类型“AnyObject”不能与字典文字一起使用?

    我正在尝试将Objective-C示例转换为Swift2,但我遇到一个小问题。原来的Objective-C片段:我认为Swift代码应该是:结果错误是:在这种情况下,如何将Objective-C转换成Swift?因此,声明数组更具体在Swift3中用于JSON集合类型或字典/数组仅包含值类型使用

  10. swift – 我可以指定generic是值类型吗?

    我知道我们可以通过使用AnyObject来基本上指定我们的泛型是任何引用类型:但是有没有办法指定我们的泛型应该只是值类型,不允许引用类型?

随机推荐

  1. xe-ajax-mock 前端虚拟服务

    最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

  2. vue 使用 xe-ajax

    安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

  3. AJAX POST数据中文乱码解决

    前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

  4. Koa2框架利用CORS完成跨域ajax请求

    实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

  5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

  6. ajax的cache作用

    filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

  7. 浅谈ajax上传文件属性contentType = false

    默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

  8. 909422229_ajaxFileUpload上传文件

    ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

  9. AJAX-Cache:一款好用的Ajax缓存插件

    原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

  10. jsf – Ajax update/render在已渲染属性的组件上不起作用

    我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

返回
顶部