MUI---上传头像功能实现

这里使用MUI上传头像的功能是结合VUE来做的,所以:

changeFace:function(){
    var IMAGE_UNSPECIFIED = "image/*"; //相册显示的文件类型
    var PHOTOZOOM = 2; // 获取完图片返回key
    var PHOTOLAT = 1; // 剪裁完毕后返回key
    var main = plus.android.runtimeMainActivity(); //h5+获取应用主Activity实例对象
    var Intent = plus.android.importClass("android.content.Intent");
    //导入java类intent对象  以下importClass都是使用安卓原生类
    var MediaStore = plus.android.importClass("android.provider.MediaStore");
    var File = plus.android.importClass("java.io.File");
    var Uri = plus.android.importClass("android.net.Uri");
    var intent = new Intent(Intent.ACTION_PICK, null);
    intent.setDataAndType(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, IMAGE_UNSPECIFIED);
    intent.putExtra("scale", true);
    intent.putExtra("scaleUpIfNeeded", true);
    var outPutPath = plus.io.convertLocalFileSystemURL("_www/head.jpg");
    main.startActivityForResult(intent, PHOTOZOOM);
    // uploadImgPath
    main.onActivityResult = (requestCode,resultCode,data)=>{
    // main.onActivityResult = function(requestCode, resultCode, data) {
        if (PHOTOZOOM == requestCode) {
            var file = new File(outPutPath);
            // 输出目录uri
            var outPutUri = Uri.fromFile(file);
            if (data == undefined) {
                return false;
            }
            plus.android.importClass(data);
            var uri = data.getData();
            var cropIntent = new Intent("com.android.camera.action.CROP"); //裁剪
            cropIntent.setDataAndType(uri, IMAGE_UNSPECIFIED);
            // 截图完毕后 输出目录
            cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, outPutUri);
            cropIntent.putExtra("crop", "true");
            //aspectX aspectY 是宽高的比例
            cropIntent.putExtra("aspectX", 1);
            cropIntent.putExtra("aspectY", 1);
            // outputX outputY 是裁剪图片宽高
            cropIntent.putExtra("outputX", 70);
            cropIntent.putExtra("outputY", 70);
            cropIntent.putExtra("return-data", true);
            main.startActivityForResult(cropIntent, PHOTOLAT);
        } else if (requestCode == PHOTOLAT) {
            if (data == undefined) {
                return false;
            }
            var a = new File(outPutPath);
            if (!a.exists()) {
                console.log(outPutPath);
                mui.toast(‘裁剪错误‘);
                return false;
            }
            this.uploadImgPath = outPutPath;
            console.log(outPutPath);
            alert(outPutPath);
            // img.src = outPutPath;
        };
    };
    // user/profile/update/
    var server = "";
    server = config.userProfileUpdate;
    var files = [];
    var upload_img = (p)=>{
        files = [];
        var n = p.substr(p.lastIndexOf(‘/‘)+1);
        files.push({name:"uploadkey"},{path:p});
        // 开始上传
        start_upload();
    };
    var start_upload = ()=>{
        if(files.length <= 0){
            plus.nativeUI.alert("没有添加上传文件");
            return;
        };
        // 原生的转圈等待框
        var wt = plus.nativeUI.showWaiting();
        var task = plus.uploader.createUpload(server,{methods:"POST"},(t,status){
            // 上传完成
            alert(status);
            if(status == 200){
                // 资源
                var responseText = t.responseText;
                // 转化为json
                var json = eval(‘(‘+responseText+‘)‘);
                // 上传文件的信息
                var files = json.files;
                // 上传成功以后的保存路径
                var img_url = files.uploadkey.url;
                alert(img_url);
                // ajax 写入数据库
                // 关闭转圈等待框
                wt.close();
            }else{
                console.log("上传失败:"+status);
            };
        });
        task.addData("client","");
        task.addData("uid",getUid()); // 每次都不同
        for(var i=0;i<files.length;i++){
            var f = files[i];
            task.addFile(f.path,{key:f.name});
        };
        task.start();// 执行到这里才会开始上传
    };
    // 产生一个随机数
    var getUid = (){
        return Math.floor(Math.random()*100000000+100000000).toString();
    };
    // main.onActivityResult = function(requestCode, resultCode, data) {
    //     if (PHOTOZOOM == requestCode) {

    //         var file = new File(outPutPath);
    //         // 输出目录uri
    //         var outPutUri = Uri.fromFile(file);
    //         if (data == undefined) {
    //             return false;
    //         }
    //         plus.android.importClass(data);
    //         var uri = data.getData();
    //         var cropIntent = new Intent("com.android.camera.action.CROP"); //裁剪
    //         cropIntent.setDataAndType(uri, IMAGE_UNSPECIFIED);
    //         // 截图完毕后 输出目录
    //         cropIntent.putExtra(MediaStore.EXTRA_OUTPUT, outPutUri);
    //         cropIntent.putExtra("crop", "true");
    //         //aspectX aspectY 是宽高的比例
    //         cropIntent.putExtra("aspectX", 1);
    //         cropIntent.putExtra("aspectY", 1);
    //         // outputX outputY 是裁剪图片宽高
    //         cropIntent.putExtra("outputX", 70);
    //         cropIntent.putExtra("outputY", 70);
    //         cropIntent.putExtra("return-data", true);
    //         main.startActivityForResult(cropIntent, PHOTOLAT);
    //     } else if (requestCode == PHOTOLAT) {
    //         if (data == undefined) {
    //             return false;
    //         }
    //         var a = new File(outPutPath);
    //         if (!a.exists()) {
    //             console.log(outPutPath);
    //             mui.toast(‘裁剪错误‘);
    //             return false;
    //         }
    //         console.log(outPutPath);
    //         alert(outPutPath);
    //         // img.src = outPutPath;
    //     }
    // }
    // this.showSelectFace = !this.showSelectFace;
    // this.selectFace = true;
    // this.mask = mui.createMask((res)=>{
    //     this.selectFace = false;
    // });
    // this.mask.show();
    // if (mui.os.plus) {
    //     var a = [{
    //         title: "拍照"
    //     },{
    //         title: "从手机相册选择"
    //     }];
    //     plus.nativeUI.actionSheet({
    //         title: "修改用户头像",
    //         cancel: "取消",
    //         buttons: a
    //     }, function(b) { /*actionSheet 按钮点击事件*/
    //         switch (b.index) {
    //             case 0:
    //                 break;
    //             case 1:
    //                 getImage(); /*拍照*/
    //                 break;
    //             case 2:
    //                 galleryImg();/*打开相册*/
    //                 break;
    //             default:
    //                 break;
    //         }
    //     })
    // };
    // 拍照
    function getImage() {
        var c = plus.camera.getCamera();
        c.captureImage(function(e) {
            plus.io.resolveLocalFileSystemURL(e, function(entry) {
                var s = entry.toLocalURL() + "?version=" + new Date().getTime();
                uploadHead(s); /*上传图片*/
            }, function(e) {
                console.log("读取拍照文件错误:" + e.message);
            });
        }, function(s) {
            console.log("error" + s);
        }, {
            filename: "_doc/head.png"
        })
    };
    // 本地相册
    function galleryImg() {
        // 从相册中选择图片
        console.log("从相册中选择图片");
        plus.gallery.pick(function(path){
            console.log(path);
        },function ( e ) {
            console.log( "取消选择图片" );
        }, {filter:"image"} );
        // 从相册中选择图片
        // plus.gallery.pick(function(a) {
        //     plus.io.resolveLocalFileSystemURL(a, function(entry) {
        //         plus.io.resolveLocalFileSystemURL("_doc/", function(root) {
        //             root.getFile("head.png", {}, function(file) {
        //                 //文件已存在
        //                 file.remove(function() {
        //                     console.log("file remove success");
        //                     entry.copyTo(root, ‘head.png‘, function(e) {
        //                             var e = e.fullPath + "?version=" + new Date().getTime();
        //                             uploadHead(e); /*上传图片*/
        //                             //变更大图预览的src
        //                             //目前仅有一张图片,暂时如此处理,后续需要通过标准组件实现
        //                         },
        //                         function(e) {
        //                             console.log(‘copy image fail:‘ + e.message);
        //                         });
        //                 }, function() {
        //                     console.log("delete image fail:" + e.message);
        //                 });
        //             }, function() {
        //                 //文件不存在
        //                 entry.copyTo(root, ‘head.png‘, function(e) {
        //                         var path = e.fullPath + "?version=" + new Date().getTime();
        //                         uploadHead(path); /*上传图片*/
        //                     },
        //                     function(e) {
        //                         console.log(‘copy image fail:‘ + e.message);
        //                     });
        //             });
        //         }, function(e) {
        //             console.log("get _www folder fail");
        //         })
        //     }, function(e) {
        //         console.log("读取拍照文件错误:" + e.message);
        //     });
        // }, function(a) {}, {
        //     filter: "image"
        // })
    };
    //上传头像图片
    function uploadHead(imgPath) {
        console.log("imgPath = " + imgPath);
        mainImage.src = imgPath;
        mainImage.style.width = "60px";
        mainImage.style.height = "60px";
        var image = new Image();
        image.src = imgPath;
        image.onload = function() {
            var imgData = getBase64Image(image);
            pc = new PhotoClip("#clipArea",{
                size: [300, 300],//裁剪框大小
                outputSize:[0,0],//打开图片大小,[0,0]表示原图大小
                ok:"#clipBtn",
                img: imgPath,
                // 图片开始加载的回调函数。this 指向当前 PhotoClip 的实例对象,并将正在加载的 file 对象作为参数传入。(如果是使用非 file 的方式加载图片,则该参数为图片的 url)
                loadStart:function(){},
                // 图片加载完成的回调函数。this 指向当前 PhotoClip 的实例对象,并将图片的 <img> 对象作为参数传入。
                loadComplete:function(){},
                // 裁剪完成的回调函数。this 指向当前 PhotoClip 的实例对象,会将裁剪出的图像数据DataURL作为参数传入。
                done:function(dataURL){
                    // 在这里调用上传接口
                    // mui.ajax("图片上传接口",{
                    //     data:{},
                    //     dataType:‘json‘,
                    //     type:‘post‘,
                    //     timeout:10000,
                    //     success:function(data){console.log(‘上传成功‘);},
                    //     error:function(xhr, type, errorThrown){mui.toast("网络异常,请稍后重试!");}
                    // });
                }
            });
        }
    };
    //将图片压缩转成base64
    function getBase64Image(img) {
        var canvas = document.createElement("canvas");
        var width = img.width;
        var height = img.height;
        // calculate the width and height, constraining the proportions
        if (width > height) {
            if (width > 100) {
                height = Math.round(height *= 100 / width);
                width = 100;
            }
        } else {
            if (height > 100) {
                width = Math.round(width *= 100 / height);
                height = 100;
            }
        }
        canvas.width = width;   /*设置新的图片的宽度*/
        canvas.height = height; /*设置新的图片的长度*/
        var ctx = canvas.getContext("2d");
        ctx.drawImage(img, 0, 0, width, height); /*绘图*/
        var dataURL = canvas.toDataURL("image/png", 0.8);
        return dataURL.replace("data:image/png;base64,", "");
    };
},

原文地址:https://www.cnblogs.com/e0yu/p/10300135.html

时间: 2024-10-17 13:57:58

MUI---上传头像功能实现的相关文章

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

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

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

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

php实现手机拍照上传头像功能

现在手机拍照很火,那么如何使用手机拍照并上传头像呢?原因很简单,就是数据传递,首先手机传递照片信息,这个就不是post传递 也不是get函数传递, 这个另外一种数据格式传递,使用的是$GLOBALS ['HTTP_RAW_POST_DATA'],这个系统函数跟post很相似,但是$GLOBALS ['HTTP_RAW_POST_DATA']支持的数据格式更丰富些,详细的区别请自己百度谷歌. 设计流程就是: $GLOBALS ['HTTP_RAW_POST_DATA']传递照片数据流(二进制)--

Android Studio第四十期 - 上传头像功能支持权限管理

代码已经整理好,加了权限管理和SP保存上传服务器的方法,希望能够帮到大家~效果如下图: 地址:https://github.com/geeklx/MyApplication/tree/master/p025_upload_img 附:这里借鉴了翔神(http://blog.csdn.net/lmj623565791/article/details/72859156)的写法,大家可以好好学习一下~哈哈~

js上传头像功能

这也是学习过程中的一个很使用的知识点就分享给大家了 注释都写在里面了 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-eq

为office 365用户上传头像

方法一 使用outlook里面配置的office 365邮箱中的上传头像功能. 方法二 使用工具进行上传,注意此工具在中国大陆实际使用过程中,可能需要×××才能正常连接.CodeTwo User Photos for Office 365 - Thanks for download https://www.codetwo.com/freeware/user-photos-for-office-365-thanks 欢迎关注如下的微信公众号,获取更多IT资讯: 原文地址:http://blog.5

asp.net mvc上传头像加剪裁功能

正好项目用到上传+剪裁功能,发上来便于以后使用. 我不能告诉你们其实是从博客园扒的前台代码,哈哈. 前端是jquery+fineuploader+jquery.Jcrop 后台是asp.net mvc 4 核心的js调用代码是crop.js和helper文件夹下的ImgHandler.cs 效果图 前台代码 <link href="~/Content/fineuploader.css" rel="stylesheet" /> <link href=

asp.net mvc上传头像加剪裁功能介绍

正好项目用到上传+剪裁功能,发上来便于以后使用. 我不能告诉你们其实是从博客园扒的前台代码,哈哈. 前端是jquery+fineuploader+jquery.Jcrop 后台是asp.net mvc 4 核心的js调用代码是crop.js和helper文件夹下的ImgHandler.cs 效果图 前台代码 <link href="~/Content/fineuploader.css" rel="stylesheet" /><link href=&

web实现QQ头像上传截取功能

由于最近一段时间比较忙,发现好久没写博客了,给大家分享下最近搞的logo上传截取功能.在实现这个功能之前找了一些jq的插件,最后选定了cropper在github中可以找到. 具体的思路是1:选择上传的图片,在change事件中用form.jquery.js中的formajax异步提交表单,保存上传的图片 2:绑定cooper事件,对图片进行选取. 3:得到选中区域的坐标,对图片进行截取保存. 其中的难点是ie的兼容性问题,由于本人也不是很好,就不献丑了下面给大家附上代码 页面中的html <d