手機網頁版JS壓縮上傳圖片--base64位 相容IOS和安卓
阿新 • • 發佈:2019-01-07
首先,我用到了一款外掛,是純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)/(\\