PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁


Posted in PHP onJune 09, 2014

昨天花了点时间整合了一下头像插件 东拼西凑的成果 先来看下效果

PHP+ajaxfileupload+jcrop插件完美实现头像上传剪裁

1.先使用ajaxfileupload插件做异步上传。这个地方我本来想做个上传进度的效果,但技术有限失败了。上传按钮我还做了一个文件大小的限制,但是由于浏览器兼容性的问题,不完美在IE6--IE9之间还有很多问题需要解决

getFileSize函数是用于判断文件大小的函数

function getFileSize(fileName) {
                var byteSize = 0;
                //console.log($("#" + fileName).val());
                if($("#" + fileName)[0].files) {
                    var byteSize  = $("#" + fileName)[0].files[0].size;
                }else {
    //此处由于有浏览器兼容问题 还没完成大小判断的逻辑
                }
                //alert(byteSize);
                byteSize = Math.ceil(byteSize / 1024) //KB
                return byteSize;//KB
            }

2.按钮上传事件绑定

$("#btnUpload").click(function () {
                var allowImgageType = ['jpg', 'jpeg', 'png', 'gif'];
                var file = $("#file1").val();
                //获取大小
                var byteSize = getFileSize('file1');
                //获取后缀
                if (file.length > 0) {
                    if(byteSize > 2048) {
                        alert("上传的附件文件不能超过2M");
                        return;
                    }
                    var pos = file.lastIndexOf(".");
                    //截取点之后的字符串
                    var ext = file.substring(pos + 1).toLowerCase();
                    //console.log(ext);
                    if($.inArray(ext, allowImgageType) != -1) {
                        ajaxFileUpload();
                    }else {
                        alert("请选择jpg,jpeg,png,gif类型的图片");
                    }
                }
                else {
                    alert("请选择jpg,jpeg,png,gif类型的图片");
                }
            });

3.在上传成功后返回图片路径,并初始化图片裁剪。图片裁剪就直接用ajax请求到php

function ajaxFileUpload() {
                $.ajaxFileUpload({
                    url: 'action.php', //用于文件上传的服务器端请求地址
                    secureuri: false, //一般设置为false
                    fileElementId: 'file1', //文件上传空间的id属性  <input type="file" id="file" name="file" />
                    dataType: 'json', //返回值类型 一般设置为json
                    success: function (data, status)  //服务器成功响应处理函数
                    {
                        //var json = eval('(' + data + ')');
                        //alert(data);
                        $("#picture_original>img").attr({src: data.src, width: data.width, height: data.height});
                        $('#imgsrc').val(data.path);
                        //alert(data.msg);
                        //同时启动裁剪操作,触发裁剪框显示,让用户选择图片区域
                        var cutter = new jQuery.UtrialAvatarCutter({
                                //主图片所在容器ID
                                content : "picture_original",
                                //缩略图配置,ID:所在容器ID;width,height:缩略图大小
                                purviews : [{id:"picture_200",width:200,height:200},{id:"picture_50",width:50,height:50},{id:"picture_30",width:30,height:30}],
                                //选择器默认大小
                                selector : {width:200,height:200},
                                showCoords : function(c) { //当裁剪框变动时,将左上角相对图片的X坐标与Y坐标 宽度以及高度
                                    $("#x1").val(c.x);
                                    $("#y1").val(c.y);
                                    $("#cw").val(c.w);
                                    $("#ch").val(c.h);
                                },
                                cropattrs : {boxWidth: 500, boxHeight: 500}
                            }
                        );
                        cutter.reload(data.src);
                        $('#div_avatar').show();
                    },
                    error: function (data, status, e)//服务器响应失败处理函数
                    {
                        alert(e);
                    }
                })
                return false;
            }
            $('#btnCrop').click(function() {
                $.getJSON('action2.php', {x: $('#x1').val(), y: $('#y1').val(), w: $('#cw').val(), h: $('#ch').val(), src: $('#imgsrc').val()}, function(data) {
                    alert(data.msg);
                });
                return false;
            });

4.HTML文件代码如下

<body>
    <p><input type="file" id="file1" name="file1" /></p>
    <input type="button" value="上传" id="btnUpload"/>
    <div style="display:none;overflow:hidden" id="div_avatar">
        <div style="width:500px;height:500px;overflow:hidden;float:left;" id="picture_original"><img alt="" src="" /></div>
        <div id="picture_200" style="float:left;margin-left:20px"></div>
        <div id="picture_50" style="float:left;margin-left:20px"></div>
        <div id="picture_30" style="float:left;margin-left:20px"></div>
        <input type="hidden" id="x1" name="x1" value="0" />
        <input type="hidden" id="y1" name="y1" value="0" />
        <input type="hidden" id="cw" name="cw" value="0" />
        <input type="hidden" id="ch" name="ch" value="0" />
        <input type="hidden" id="imgsrc" name="imgsrc" />
        <input type="button" value="裁剪上传" id="btnCrop"/>
    </div>
</body>

现在还很粗糙,功能还有很多需要完善的地方。大家有兴趣的话,就拿去使用吧。如果完善了进度条和文件大小的功能,记得也分享给我一份哦。

附上源码 https://3water.com/codes/174384.html

PHP 相关文章推荐
php代码优化及php相关问题总结
Oct 09 PHP
PHP 变量类型的强制转换
Oct 23 PHP
PHP学习之字符串比较和查找
Apr 17 PHP
PHP实现根据浏览器跳转不同语言页面代码
Aug 02 PHP
php+ajax导入大数据时产生的问题处理
Jun 11 PHP
PHP输入流php://input实例讲解
Dec 22 PHP
PHP不使用递归的无限级分类简单实例
Nov 05 PHP
PHP中SQL查询语句的id=%d解释(推荐)
Dec 10 PHP
浅谈PHP的$_SERVER[SERVER_NAME]
Feb 04 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
Jul 26 PHP
PHP面向对象五大原则之里氏替换原则(LSP)详解
Apr 08 PHP
MacOS下PHP7.1升级到PHP7.4.15的方法
Feb 22 PHP
神盾加密解密教程(三)PHP 神盾解密工具
Jun 08 #PHP
神盾加密解密教程(二)PHP 神盾解密
Jun 08 #PHP
IIS6.0 开启Gzip方法及PHP Gzip函数分享
Jun 08 #PHP
PHP获取中英混合字符串长度的方法
Jun 07 #PHP
使用PHP破解防盗链图片的一个简单方法
Jun 07 #PHP
PHP防止post重复提交数据的简单例子
Jun 07 #PHP
解决PhpMyAdmin中导入2M以上大文件限制的方法分享
Jun 06 #PHP
You might like
Adodb的十个实例(清晰版)
2006/12/31 PHP
php 防止单引号,双引号在接受页面转义
2008/07/10 PHP
PHP 变量的定义方法
2010/01/26 PHP
PHP基础教程(php入门基础教程)一些code代码
2013/01/06 PHP
smarty模板局部缓存方法使用示例
2014/06/17 PHP
PHP.vs.JAVA
2016/04/29 PHP
PHP基于回溯算法解决n皇后问题的方法示例
2017/11/07 PHP
Javascript中的var_dump函数实现代码
2009/09/07 Javascript
javascript iframe编程相关代码
2009/12/28 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
你必须知道的JavaScript 中字符串连接的性能的一些问题
2013/05/07 Javascript
jQuery中attr()与prop()函数用法实例详解(附用法区别)
2015/12/29 Javascript
解析JavaScript中的字符串类型与字符编码支持
2016/06/24 Javascript
Nodejs从有门道无门菜鸟起飞必看教程
2016/07/20 NodeJs
AngularJS使用ng-options指令实现下拉框
2016/08/23 Javascript
js封装tab标签页实例分享
2016/12/19 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
Vue组件化通讯的实例代码
2017/06/23 Javascript
Vue使用vue-cli创建项目
2017/09/01 Javascript
NodeJs form-data格式传输文件的方法
2017/12/13 NodeJs
vue中的inject学习教程
2019/04/24 Javascript
jquery选择器和属性对象的操作实例分析
2020/01/10 jQuery
详细介绍解决vue和jsp结合的方法
2020/02/06 Javascript
复习Python中的字符串知识点
2015/04/14 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
详解Python安装tesserocr遇到的各种问题及解决办法
2019/03/07 Python
通过python改变图片特定区域的颜色详解
2019/07/15 Python
Django中reverse反转并且传递参数的方法
2019/08/06 Python
keras实现VGG16方式(预测一张图片)
2020/07/07 Python
pytorch加载语音类自定义数据集的方法教程
2020/11/10 Python
《金色的脚印》教后反思
2014/04/23 职场文书
公司活动总结怎么写
2014/06/25 职场文书
乡镇领导班子批评与自我批评材料
2014/09/23 职场文书
离婚协议书的范本
2015/01/27 职场文书
Python办公自动化解决world文件批量转换
2021/09/15 Python
Java实现二分搜索树的示例代码
2022/03/17 Java/Android