1. 程式人生 > >手機網頁版JS壓縮上傳圖片--base64位 相容IOS和安卓

手機網頁版JS壓縮上傳圖片--base64位 相容IOS和安卓

首先,我用到了一款外掛,是純JS壓縮上傳外掛,第一次用CSDN,不太會用,我把外掛所有程式碼拷貝在文章末尾。
載入JS外掛<script src="__JS__/dist/lrz.mobile.min.js"></script>

頁面上傳圖片:

    <div class="fileupload-buttonbar">
        <a type="button" class="am-btn am-btn-sm am-fl " style="  line-height: 0.2;"><img
src="__IMG__/image.png"
></a> <div class="fileinput-button" style="width: 100%"> <input type="file" name="files" class="btn" id="choose" style="left: 35px;position:absolute;z-index: 1;width: 35px;height:40px;opacity: 0;cursor: pointer;" data-url="{:U('Core/File/uploadPictureBase64')}" multiple
/></div> <style> .img-list li { float: left; position: relative; display: inline-block; width: 100px; height: 100px; margin: 5px 5px 20px 5px; border: 1px solid rgb(100, 149, 198); background: #fff no-repeat center; background-size: cover; border-radius: 5px
; } </style> </div> <!--插入圖片表情結束-->    <!--釋出按鈕--> <p class="submitweibo" url="{:U('Mob/Weibo/doSend')}"> <button style="float: right" type="submit" class="am-btn am-btn-primary am-btn-block">釋出</button> </p> <!--釋出按鈕END--> </div> <ul class="img-list am-fl" style="padding-left:0px;"> <!--圖片顯示區域--> </ul>

圖片id存放,隱藏input,放在頁面的form表單內即可。

<input type="hidden" id="img_ids" name="attach_ids" value="">

js程式碼

//新上傳圖片
function add_img() {
    var filechooser = document.getElementById("choose");
$("#upload").on("click", function () {
        filechooser.click();
})
    filechooser.onchange = function () {
        if (!this.files.length) return;
var files = Array.prototype.slice.call(this.files);
if (files.length > 9) {
            alert("最多同時只可上傳9張圖片");
return;
}
        files.forEach(function (files, i) {
            if (!/\/(?:jpeg|png|gif)/i.test(files.type)){
                toast.error('上傳圖片格式不符!');
}
            var div = ' <li class="waitbox loadingBox">\
            <img src= ' + _LOADING_ + '  style="width:90px,hight:90px"> \
        </li> ';
$('.img-list').append(div);
lrz(files, {
                width: 1200,
height: 900,
before: function () {
                    console.log('壓縮開始');
},
fail: function (err) {
                    console.error(err);
},
always: function () {
                    console.log('壓縮結束');
},
done: function (results) {
                    // 你需要的資料都在這裡,可以以字串的形式傳送base64給服務端轉存為圖片。
var data=results.base64;
upload(data);
}
            });
})
    }
}

function removeLi(li,file_id) {
console.log(li)
    upAttachVal('remove', file_id, $('#img_ids'))
    $(li).parent('.waitbox').remove();
}
//圖片上傳,返回id ,地址
function upload(data) {
    console.log(data);
var dataUrl = U('Core/File/uploadPictureBase64');
$.post(dataUrl, {data: data}, function (msg) {
        if (msg.status == 1) {
            var ids = $('#img_ids').val();
upAttachVal('add', msg.id, $('#img_ids'));
//上傳成功顯示圖片
var div = ' <li class="waitbox">\
                <a class="del-btn am-icon-close"  onclick="removeLi(this, '+msg.id+')" style="position:absolute;right: 5px;top: -5px;color: red"></a>\
            <img src= ' + msg.path + '  style="width:99px;height:99px;"> \
        </li> ';
$('.loadingBox').hide();
$('.img-list').append(div);
} else {
            toast.error(msg.info);
}
    }, 'json')

}

function upAttachVal(type, attachId, obj) {
    var $attach_ids = obj;
var attachVal = $attach_ids.val();
var attachArr = attachVal.split(',');
var newArr = [];
for (var i in attachArr) {
        if (attachArr[i] !== '' && attachArr[i] !== attachId.toString()) {
            newArr.push(attachArr[i]);
}
    }
    type === 'add' && newArr.push(attachId);
if (newArr.length <= 9) {
        $attach_ids.val(newArr.join(','));
return newArr;
} else {
        return false;
}

}

後臺php程式碼:

public function uploadPictureBase64()
{

    $aData = $_POST['data'];

    if ($aData == '' || $aData == 'undefined') {
        $this->ajaxReturn(array('status'=>0,'info'=>'引數錯誤'));
    }

    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $aData, $result)) {
        $base64_body = substr(strstr($aData, ','), 1);

        empty($aExt) && $aExt = $result[2];
    } else {
        $base64_body = $aData;
    }

    empty($aExt) && $aExt = 'jpg';

    $pictureModel = D('Picture');

    $md5 = md5($base64_body);
    $sha1 = sha1($base64_body);


    $check = $pictureModel->where(array('md5' => $md5, 'sha1' => $sha1))->find();

    if ($check) {
        //已存在則直接返回資訊
$return['id'] = $check['id'];
        $return['path'] = render_picture_path($check['path']);
        $this->ajaxReturn(array('status'=>1,'id'=>$return['id'],'path'=> $return['path']));
    } else {
        //不存在則上傳並返回資訊
$driver = modC('PICTURE_UPLOAD_DRIVER','local','config');
        $driver = check_driver_is_exist($driver);
        $date = date('Y-m-d');
        $saveName = uniqid();
        $savePath = '/Uploads/Picture/' . $date . '/';

        $path = $savePath . $saveName . '.' . $aExt;
        if($driver == 'local'){
            //本地上傳
mkdir('.' . $savePath, 0777, true);
            $data = base64_decode($base64_body);
            $rs = file_put_contents('.' . $path, $data);
        }
        else{
            $rs = false;
            //使用雲端儲存
$name = get_addon_class($driver);
            if (class_exists($name)) {
                $class = new $name();
                if (method_exists($class, 'uploadBase64')) {
                    $path = $class->uploadBase64($base64_body,$path);
                    $rs = true;
                }
            }
        }
        if ($rs) {
            $pic['type'] = $driver;
            $pic['path'] = $path;
            $pic['md5'] = $md5;
            $pic['sha1'] = $sha1;
            $pic['status'] = 1;
            $pic['create_time'] = time();
            $id = $pictureModel->add($pic);
           $this->ajaxReturn (array('status'=>1,'id' => $id, 'path' => render_picture_path($path)));
        } else {
            $this->ajaxReturn(array('status'=>0,'圖片上傳失敗。'));
        }

    }
}

function render_picture_path($path)
{
    $path = get_pic_src($path);
    return is_bool(strpos($path, 'http://')) ? 'http://' . str_replace('//', '/', $_SERVER['HTTP_HOST'] . '/' . $path) : $path;
}

function get_pic_src($path)
{

    //不存在http://
$not_http_remote = (strpos($path, 'http://') === false);
    //不存在https://
$not_https_remote = (strpos($path, 'https://') === false);
    if ($not_http_remote && $not_https_remote) {
        //本地url
return str_replace('//', '/', getRootUrl() . $path); //防止雙斜槓的出現
} else {
        //遠端url
return $path;
    }
}

外掛程式碼:

!function (e) {
    Array.prototype.map || (Array.prototype.map = function (e, r) {
        var a, t, n;
        if (null == this)throw new TypeError(" this is null or not defined");
        var o = Object(this), i = o.length >>> 0;
        if ("function" != typeof e)throw new TypeError(e + " is not a function");
        for (r && (a = r), t = Array(i), n = 0; i > n;) {
            var l, d;
            n in o && (l = o[n], d = e.call(a, l, n, o), t[n] = d), n++
}
        return t
    });
    var r = e.detect = function () {
        var e = function () {
        }, r = {
            browser_parsers: [{
                regex: "^(Opera)/(\\d+)\\.(\\d+) \\(Nintendo Wii",
                family_replacement: "Wii",
                manufacturer: "Nintendo"
}, {
                regex: "(SeaMonkey|Camino)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)",
                family_replacement: "Camino",
                other: !0
}, {
                regex: "(Pale[Mm]oon)/(\\d+)\\.(\\d+)\\.?(\\d+)?",
                family_replacement: "Pale Moon (Firefox Variant)",
                other: !0
}, {
                regex: "(Fennec)/(\\d+)\\.(\\d+)\\.?([ab]?\\d+[a-z]*)",
                family_replacement: "Firefox Mobile"
}, {
                regex: "(Fennec)/(\\d+)\\.(\\d+)(pre)",
                family_replacment: "Firefox Mobile"
}, {
                regex: "(Fennec)/(\\d+)\\.(\\d+)",
                family_replacement: "Firefox Mobile"
}, {
                regex: "Mobile.*(Firefox)/(\\d+)\\.(\\d+)",
                family_replacement: "Firefox Mobile"
}, {
                regex: "(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?)",
                family_replacement: "Firefox ($1)"
}, {
                regex: "(Firefox)/(\\d+)\\.(\\d+)(a\\d+[a-z]*)",
                family_replacement: "Firefox Alpha"
}, {
                regex: "(Firefox)/(\\d+)\\.(\\d+)(b\\d+[a-z]*)",
                family_replacement: "Firefox Beta"
}, {
                regex: "(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(a\\d+[a-z]*)",
                family_replacement: "Firefox Alpha"
}, {
                regex: "(Firefox)-(?:\\d+\\.\\d+)?/(\\d+)\\.(\\d+)(b\\d+[a-z]*)",
                family_replacement: "Firefox Beta"
}, {
                regex: "(Namoroka|Shiretoko|Minefield)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?",
                family_replacement: "Firefox ($1)"
}, {
                regex: "(Firefox).*Tablet browser (\\d+)\\.(\\d+)\\.(\\d+)",
                family_replacement: "MicroB",
                tablet: !0
}, {regex: "(MozillaDeveloperPreview)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)?"}, {
                regex: "(Flock)/(\\d+)\\.(\\d+)(b\\d+?)",
                family_replacement: "Flock",
                other: !0
}, {
                regex: "(RockMelt)/(\\d+)\\.(\\d+)\\.(\\d+)",
                family_replacement: "Rockmelt",
                other: !0
}, {
                regex: "(Navigator)/(\\d+)\\.(\\d+)\\.(\\d+)",
                family_replacement: "Netscape"
}, {
                regex: "(Navigator)/(\\d+)\\.(\\d+)([ab]\\d+)",
                family_replacement: "Netscape"
}, {
                regex: "(Netscape6)/(\\d+)\\.(\\d+)\\.(\\d+)",
                family_replacement: "Netscape"
}, {
                regex: "(MyIBrow)/(\\d+)\\.(\\d+)",
                family_replacement: "My Internet Browser",
                other: !0
}, {
                regex: "(Opera Tablet).*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?",
                family_replacement: "Opera Tablet",
                tablet: !0
}, {
                regex: "(Opera)/.+Opera Mobi.+Version/(\\d+)\\.(\\d+)",
                family_replacement: "Opera Mobile"
}, {regex: "Opera Mobi", family_replacement: "Opera Mobile"}, {
                regex: "(Opera Mini)/(\\d+)\\.(\\d+)",
                family_replacement: "Opera Mini"
}, {
                regex: "(Opera Mini)/att/(\\d+)\\.(\\d+)",
                family_replacement: "Opera Mini"
}, {
                regex: "(Opera)/9.80.*Version/(\\d+)\\.(\\d+)(?:\\.(\\d+))?",
                family_replacement: "Opera"
}, {regex: "(webOSBrowser)/(\\d+)\\.(\\d+)", family_replacement: "webOS"}, {
                regex: "(webOS)/(\\d+)\\.(\\d+)",
                family_replacement: "webOS"
}, {regex: "(wOSBrowser).+TouchPad/(\\d+)\\.(\\d+)", family_replacement: "webOS TouchPad"}, {
                regex: "(luakit)",
                family_replacement: "LuaKit",
                other: !0
}, {
                regex: "(Lightning)/(\\d+)\\.(\\d+)([ab]?\\d+[a-z]*)",
                family_replacement: "Lightning",
                other: !0
}, {
                regex: "(Firefox)/(\\d+)\\.(\\d+)\\.(\\d+(?:pre)?) \\(Swiftfox\\)",
                family_replacement: "Swiftfox",
                other: !0
}, {
                regex: "(Firefox)/(\\d+)\\.(\\d+)([ab]\\d+[a-z]*)? \\(Swiftfox\\)",
                family_replacement: "Swiftfox",
                other: !0
}, {
                regex: "rekonq",
                family_replacement: "Rekonq",
                other: !0
}, {
                regex: "(conkeror|Conkeror)/(\\d+)\\.(\\d+)\\.?(\\d+)?",
                family_replacement: "Conkeror",
                other: !0
}, {
                regex: "(konqueror)/(\\d+)\\.(\\d+)\\.(\\d+)",
                family_replacement: "Konqueror",
                other: !0
}, {
                regex: "(WeTab)-Browser",
                family_replacement: "WeTab",
                other: !0
}, {
                regex: "(Comodo_Dragon)/(\\