利用 jQuery-photoClip插件 实现移动端裁剪功能并以Blob对象上传

最近客户要求实现论坛贴子附件裁剪功能,没有考虑js与ios、android容器交互解决方案,单纯用js去实现它的。由于本来附件上传用的别的插件实现的,所以是在此基础上费了不少劲,才把jQuery-photoClip裁剪功能垒上去,但好再最后成功实现了。在实现过程中遇到了几个问题,记下来和大家一起学习研究。

由于安全原因,是不允许js操作文件的。所以jQuery-photoClip裁剪下来的是base64字符串,把此字符串上传后台解码为文件,就可以了。但是如果字符串过大,用post或geth上传就会超过浏览器传输最大量,后台就会接收失败,那看来用普通字符串上传行不通。接着又继续研究,不断查找资料,问题终于解决,js把base64字符串解码转成Blob对象再进行上传,效果和文件上传一样,php在用台用$_FILES接收就可以了。

http://www.htmleaf.com/jQuery/Image-Effects/201510292721.html  这里有jQuery-photoClip介绍与下载

<!doctype html>
<html lang="zh">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
    <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no, minimal-ui" />
    <meta name="apple-mobile-web-app-capable" content="yes" />
    <meta name="format-detection" content="telephone=no, email=no" />
    <title>支持移动设备触摸手势的jQuery图片裁剪插件</title>
    <link rel="stylesheet" type="text/css" href="css/normalize.css" />
    <link rel="stylesheet" type="text/css" href="css/default.css">
    <style>
    #clipArea {
        margin: 20px;
        height: 300px;
    }
    #file,
    #clipBtn {
        margin: 20px;
    }
    #view {
        margin: 0 auto;
        width: 200px;
        height: 200px;
    }
    </style>
    <!--[if IE]>
        <script src="http://libs.useso.com/js/html5shiv/3.7/html5shiv.min.js"></script>
    <![endif]-->
</head>
<body ontouchstart="">
    <article class="htmleaf-container">
        <div id="clipArea"></div>
        <input type="file" id="file">
        <button id="clipBtn">截取</button>
        <div id="view"></div>
    </article>

    <script src="http://libs.useso.com/js/jquery/2.1.1/jquery.min.js" type="text/javascript"></script>
    <script>window.jQuery || document.write(‘<script src="js/jquery-2.1.1.min.js"><\/script>‘)</script>
    <script src="js/iscroll-zoom.js"></script>
    <script src="js/hammer.js"></script>
    <script src="js/jquery.photoClip.js"></script>
    <script>
    var one_obj = {
        /**
         * @param base64Codes
         *        图片的base64编码
         */
        funUploadFile: function(base64Codes){
            var self = this;
            var formData = new FormData();
            //convertBase64UrlToBlob函数是将base64编码转换为Blob
            //append函数的第一个参数是后台获取数据的参数名,在php中用$FILES[‘imageName‘]接收,
            formData.append("imageName",self.convertBase64UrlToBlob(base64Codes));
            //ajax 提交form
            $.ajax({
                // 你后台的接收地址
                url : ‘your_url‘,
                type : "POST",
                data : formData,
                dataType:"json",
                processData : false,         // 告诉jQuery不要去处理发送的数据
                contentType : false,        // 告诉jQuery不要去设置Content-Type请求头

                success:function(data){
                    console.log(‘上传成功‘);
                },
                xhr:function(){            //在jquery函数中直接使用ajax的XMLHttpRequest对象
                    var xhr = new XMLHttpRequest();

                    xhr.upload.addEventListener("progress", function(evt){
                        if (evt.lengthComputable) {
                            var percentComplete = Math.round(evt.loaded * 100 / evt.total);
                            console.log("正在提交."+percentComplete.toString() + ‘%‘);        //在控制台打印上传进度
                        }
                    }, false);

                    return xhr;
                }

            });
        },

        /**
         * 将以base64的图片url数据转换为Blob
         * @param urlData
         *            用url方式表示的base64图片数据
         */
        convertBase64UrlToBlob: function(urlData){
            //去掉url的头,并转换为byte
            var bytes=window.atob(urlData.split(‘,‘)[1]);        

            //处理异常,将ascii码小于0的转换为大于0
            var ab = new ArrayBuffer(bytes.length);
            var ia = new Uint8Array(ab);
            for (var i = 0; i < bytes.length; i++) {
                ia[i] = bytes.charCodeAt(i);
            }
            // 此处type注意与photoClip初始化中的outputType类型保持一致
            return new Blob( [ab] , {type : ‘image/jpeg‘});
        },

        init: function() {
            var self = this;
            $("#clipArea").photoClip({
                width: 200,
                height: 200,
                file: "#file",
                view: "#view",
                ok: "#clipBtn",
                outputType: ‘jpg‘,
                loadStart: function() {
                    console.log("照片读取中");
                },
                loadComplete: function() {
                    console.log("照片读取完成");
                },
                clipFinish: function(dataURL) {
                    console.log(‘裁剪完成‘);
                    self.funUploadFile(dataURL);
                }
            });
        }
    };

    one_obj.init();

    </script>
</body>
</html>
时间: 2024-10-06 00:25:46

利用 jQuery-photoClip插件 实现移动端裁剪功能并以Blob对象上传的相关文章

js 利用iframe和location.hash跨域解决的方法,java图片上传回调JS函数跨域

奶奶的:折腾了我二天,最终攻克了!网上有非常多样例. 但跟我的都不太一样,费话不多说了,上图   上代码: IE ,firefix,chrome 測试通过 js :这个主页面,部分代码, function submitUpload(id){ $("#imgSrc" + id +"").attr("alt", "图片上传中--"); var imgID = id; if(id>0){ imgID = 1; } var fo

利用jQuery对插件进行扩展时,方法$.extend()、$.fn.extend()区别与联系

  利用JQ开发插件的方法: 1.jQuery.extend(); 2.jQuery.fn.extend(); 3.通过$.widget()应用jQuery UI的部件工厂方式创建. 由于第三种方式通常用于开发比较高级的jQuery的部件,开发难度较大,所以第一种和第二种方式用的更为广泛,下面主要对前两种方式的区别和联系以及使用的方法做一些介绍. 简要的说明一下: jQuery是一个封装的非常好的类,$(“#btn”)就相当于创建了一个jQuery的实例. 1.方法jQuery.fn .exte

使用jQuery.FileUpload插件和Backload组件裁剪上传图片

□ 思路 1.自定义控制器继承Backload的默认控制器BackloadController2.自定义一个jQuery File Upload初始化js文件,使用自定义控制器的方法3.在视图页面调用自定义jQuery File Upload初始化js文件 □ 安装Backload组件和jQuery File Upload插件 →在"程序包管理器控制台"输入:Install-Package Backload →在"程序包管理器控制台"输入: Install-Pack

jQuery Validate 插件,表单验证功能

连接地址:http://www.w3cschool.cc/jquery/jquery-plugin-validate.html jQuery Validate jQuery Validate 插件为表单提供了强大的验证功能,让客户端表单验证变得更简单,同时提供了大量的定制选项,满足应用程序各种需求.该插件捆绑了一套有用的验证方法,包括 URL 和电子邮件验证,同时提供了一个用来编写用户自定义方法的 API.所有的捆绑方法默认使用英语作为错误信息,且已翻译成其他 37 种语言. 该插件是由 Jör

jquery 通过ajax FormData 对象上传附件

之前上传附件都是用插件,或者用form表单体检(这个是很久以前的方式了),今天突发奇想,自己来实现附件上传,具体实现如下 html: <div>   流程图: <input id="file" type="file" >   <button ng-click="bpmmainFunction.createBpm()">提交</button></div> js: $scope.bpmmai

微信端wap网页,多个图片上传后编辑的问题

最近参与了一个微信网页端的开发,其中有一个上传多个图片的功能,如下 下方能够添加多张图片,通过thinkPHP的图片上传类接收,将图片名以逗号分隔的形式存在数据库里. 编辑时看起来时好好的 待续..

JQuery实现选择桌面照片,替换为网页背景【以及解决上传文件路径问题】

1.上传文件出现问题: 2.选择桌面文件,获取input标签的值,出现一个假的路径,这是由于浏览器的保护机制. 3.解决这个方法,自然可以取消浏览器的保护机制[*******但这不可取,所以此篇重点就出来了] 重点:4.解决获取input的file值问题. 重点js代码: //修改背景图片的方法 function changBackground(){ /** * 文件预览 */ var fileObj = document.getElementById("file_road").fil

利用jquery mobiscroll插件选择日期、select、treeList的具体运用

mobiscroll是个很好用的用于移动端滑动选择的插件,可以用来选择日期,也可以用来选择简单选项或者一些复杂的树形结构的选项,简单分享下. 依赖也比较简单,引入一个mobiscroll-2.13.2.full.min.js文件和一个mobiscroll-2.13.2.full.min.css文件即可. 参考官网http://docs.mobiscroll.com 1.选择日期,先看效果图: js代码: var opt={}; opt.datetime = {}; opt.default = {

利用jQuery无插件创建可扩展目录树

这是一个简单.轻量级的,基于jQuery的目录树.纯html代码. <html> <head> </head> <script type="text/javascript" src="http://code.jquery.com/jquery-latest.js"></script>   <script> $( document ).ready( function( ) {     $( '.t