apicloud实现先压缩再上传图片到云端数据库

注意:部分机型使用下面模块可能会出现bug,如拍照闪退,压缩大图片时闪退。模块是第三方开发的,出现bug也没有办法(尴尬脸)

需要在apicloud控制台中引入UIMediaScanner模块、imageFilter模块,如下图:

废话少说,直接上码

html代码:

<input type="button" value="上传头像" onclick="selectPhone()"/>
<img id="avatar" name="avatar" src="" width="100px;">

js代码:

思路:

  1. 先调用UIMediaScanner模块显示图片
  2. 然后调用imageFilter模块对图片进行压缩
  3. 最后将图片上传到云端数据库的file表中

引入相关js:

  • api.js
  • APICloud-rest-SHA1.js
var uiMediaScanner;
    var imageFilter ;
    //设置最大宽度和高度
    var mostW = 690;        
    var mostH = 690;
    apiready = function(){
        //需要在控制台中为本项目添加以下模块
        //UIMediaScanner 是一个多媒体扫描器,可扫描系统的图片、视频等多媒体资源
        uiMediaScanner = api.require('UIMediaScanner');
        //实现图片压缩的功能
        imageFilter = api.require('imageFilter');
    };


    function selectPhone(){
        api.actionSheet({
            title: '上传头像',
            cancelTitle: '取消',
            buttons: ['拍照','从手机相册选择']
        }, function(ret, err) {
            if (ret) {
                getPicture(ret.buttonIndex);
            }
        });

    }
    function getPicture(sourceType){
        if(sourceType==1){ // 拍照
            //获取一张图片
            api.getPicture({
                sourceType: 'camera',
                encodingType: 'png',
                mediaValue: 'pic',
                allowEdit: false,
                quality: 90,
                saveToPhotoAlbum: true
            }, function(ret, err) {
                // 获取拍照数据并处理
                if (ret) {
                    var imgSrc = ret.data;
                    if (imgSrc != "") {
                        var ele=$api.dom('#avatar');
                        $api.attr(ele,'src',imgSrc);
                        compress(imgSrc);
                    }
                }
            });
        }else if(sourceType==2){ // 从相机中选择
            uiMediaScanner.open({
                //返回的资源种类,picture(图片),video(视频),all(图片和视频)
                type: 'picture',
                //(可选项)图片显示的列数,须大于1
                column: 4,
                max: 1,
                //(可选项)图片排序方式,asc(旧->新),desc(新->旧)
                sort: {
                    key: 'time',
                    order: 'desc'
                },
                //(可选项)模块各部分的文字内容
                texts: {
                    stateText: '已选择*项',
                    cancelText: '取消',
                    finishText: '完成'
                },
                styles: {
                    bg: '#fff',
                    mark: {
                        icon: '',
                        position: 'bottom_right',
                        size: 20
                    },
                    nav: {
                        bg: '#eee',
                        stateColor: '#000',
                        stateSize: 18,
                        cancleBg: 'rgba(0,0,0,0)',
                        cancelColor: '#000',
                        cancelSize: 18,
                        finishBg: 'rgba(0,0,0,0)',
                        finishColor: '#000',
                        finishSize: 18
                    }
                }
            }, function(ret) {
                // 获取图片数据并处理
                if (ret) {
                    alert(JSON.stringify(ret));
                    if (ret.list.length> 0) {
                        var imgSrc=ret.list[0].path;
//                        for(var i=0;i<ret.list.length;i++){
//                            var imgSrc=ret.list[i].path;
//                            alert(imgSrc);
//                        }
                        var ele=$api.dom('#avatar');
                        $api.attr(ele,'src',imgSrc);
                        compress(imgSrc);
                    }
                }
            });
        }

    }
    /*
     * 图片上传
     */
    function updateFile(path,filename){
        var client = new Resource(KEY.appId, KEY.appKey);
        var File = client.Factory("file");
        File.save(
        {
            file:
            {
                isFile:true,
                path:path,
                values:
                {
                    filename:filename
                }
            }
        },
        function(data,err){
            api.hideProgress();
            if(data){
                alert("上传结果:"+JSON.stringify(data));
            }else{
                alert("上传发生错误:"+JSON.stringify(err));
            }
        })
    }
    /*
     * 图片压缩
     * path:要压缩图片的路径
     */
    function compress(path){
        api.showProgress({
            style: 'default',
            animationType: 'fade',
            title: '请稍后...',
            text: '压缩图片...',
            modal: false
        });
        /*
         * 缩放比例
         * 获取图片的高、宽信息
         */
        imageFilter.getAttr({
            path: path
        }, function(ret, err) {
            var imgAttr=changeImg(ret.width,ret.height);
            var suffix=getSuffix(path);
            var tempFolder="./temp/"
            var tempFileName=Math.floor(1000)+"."+suffix;
            imageFilter.compress({
                img: path,
                size:{
                    w:imgAttr.width,
                    h:imgAttr.height
                },
                save:{
                    album:true,
                    imgPath:tempFolder,
                    imgName:tempFileName
                }
            }, function(ret, err) {
                api.hideProgress();
                if (ret) {
                    alert("压缩结果:"+JSON.stringify(ret));
                    api.showProgress({
                        style: 'default',
                        animationType: 'fade',
                        title: '请稍后...',
                        text: '正在上传图片...',
                        modal: false
                    });
                    updateFile(tempFolder+tempFileName,"");
                } else {
                    alert(JSON.stringify(err));
                }
            });
        });

    }
    function getSuffix(filePath){
        var pos=filePath.lastIndexOf(".");
        return filePath.substring(pos+1);  
    }
    /*
     * 传入图片宽和高,如果宽度大于高度,并且宽度大于最大宽度,就以宽度为基准计算缩小比例
     * 返回值:json类型,缩放后的高、宽
     */
    function changeImg(w,h){   
        var retW=0;
        var retH=0;
        if(w>h){
            if(w > mostW){
                var scaling = 1-(w-mostW)/w;    
                //计算缩小比例
                retW = w*scaling;
                retH = h*scaling;
            }
        }else{
             if(h > mostH){
                var scaling = 1-(h-mostH)/h;    
                //计算缩小比例
                retW = w*scaling;
                retH = h*scaling;
            }
        }
         return {'width':retW,'height':retH};

    }

原文出处:/show_1C7cWmdeDI5.html