php
存储图片
if(!isset($_POST[\'imgData\'])) { $rawData = $GLOBALS["HTTP_RAW_POST_DATA"]; $fieldDatas = explode(\'&\', $rawData); foreach ($fieldDatas as $fieldData) { list($field, $value) = explode(\'=\', $fieldData); $_POST[$field] = urldecode($value); } } $imgOrientation = $_POST[\'imgOrientation\']; $imgData = $_POST[\'imgData\']; if (!$imgData) { $this->ajax_fail_exit(\'没有图片内容\'); } $imgData = urldecode($imgData); file_put_contents(\'/tmp/aaaa.txt\', $imgData); $isMatch = preg_match(\'#^data:([^;]*);base64,#U\', $imgData, $match); $imageType = \'\'; if ($isMatch) { $imgData = str_replace($match[0], \'\', $imgData); $imageType = $match[1]; } $imgData = base64_decode($imgData); $extMatch = array( \'image/gif\' => \'gif\', \'image/jpeg\' => \'jpg\', \'image/png\' => \'png\', \'image/bmp\' => \'bmp\', ); if (!$imageType || !isset($extMatch[$imageType])) { $this->ajax_fail_exit(\'不是图片,无法上传\'); } $file_ext = $extMatch[$imageType]; #检查文件大小 if (strlen($imgData) > 3072000) { $this->ajax_fail_exit(\'图片大小过大,应小于3M\'); } $dir_name = \'image\'; $uploadConfig = Config::getInstance()->get(\'upload_u\'); //文件保存目录路径 $save_path = $uploadConfig[\'path\'] . \'/\'; //文件保存目录URL $save_url = $uploadConfig[\'url\'] . \'/\'; $ymd = date("Ymd"); $ymd = date("Y") . \'/\' . date(\'md\'); $save_path .= $dir_name . "/" . $ymd . "/"; $save_url .= $dir_name . "/" . $ymd . "/"; //新文件名 $new_file_name = date("His") . \'_\' . rand(10000, 99999); # 保存文件路径 $save_file_path = $save_path . $new_file_name . \'.\' . $file_ext; # 图片地址 $imageUrl = $save_url . $new_file_name . \'.\' . $file_ext; # 上传图片 #检查目录 if (@is_dir($save_path) === false) { #创建目录 if (!mkdir($save_path, 0777, true)) { $this->ajax_fail_exit("创建目录失败:{$save_path}"); } } #检查目录写权限 if (@is_writable($save_path) === false) { $this->ajax_fail_exit("上传目录没有写权限"); } #移动文件 if (!file_put_contents($save_file_path, $imgData)) { $this->ajax_fail_exit("上传文件失败"); } // 压缩65质量原图 $this_basename = basename($save_file_path); $this_dirname = dirname($save_file_path); $z_file_path = $this_dirname.\'/\'.\'z.\'.$this_basename; \KIF\Image::transformFormat($save_file_path,$z_file_path,\'JPG\'); $img = imagecreatefromjpeg($z_file_path); // 获取拍摄角度 旋转图片 if($imgOrientation && $imgOrientation==6){ $new=imagerotate($img,-90,0); imagejpeg($new,$z_file_path,65); imagedestroy ($new); }else{ imagejpeg($img,$z_file_path,65); imagedestroy ($img); } @chmod($save_file_path, 0777); $imageUrl = $save_url .\'z.\' . $new_file_name . \'.\' . $file_ext; list($width, $height) = getimagesize($z_file_path); $result = array( \'il\' => $imageUrl, \'w\' => $width, \'h\' => $height, ); $this->ajax_success_exit($result);
js
// 小米手机上传图片太大或没有获取到图片的type var extStr = \'gif,jpg,jpeg,png,bmp\'; var extMimeMatch = new Array(); extMimeMatch[\'gif\'] = \'image/gif\'; extMimeMatch[\'jpg\'] = \'image/jpeg\'; extMimeMatch[\'jpeg\'] = \'image/jpeg\'; extMimeMatch[\'png\'] = \'image/png\'; extMimeMatch[\'bmp\'] = \'image/bmp\'; var useCompressUpload = 1; if (navigator.userAgent.match(/MI\s1S/i)) { useCompressUpload = 0; } if (useCompressUpload) { compressUploadImg(); // 压缩上传 } else { normalUploadImg(); //图片上传 } function normalUploadImg() { $("input[type=file]").change(function(e) { var arrUrl = []; var files = e.target.files || e.dataTransfer.files; var $frm = $(this).parents(\'div[data-form]\'); var imgUrlsInput = $(\'input[name=imgUrls]\', $frm); var className = $(this).attr(\'data-form-class\'); var newUrl = list = \'\'; clearMsg($frm); var imgUrls = imgUrlsInput.val(); if (imgUrls) arrUrl = imgUrls.split(\',\'); if (files.length + arrUrl.length > 8) { showMsg($frm, \'图片最多上传8张\'); return false; } for (var i = 0, file; file = files[i]; i++) { var tmpStr = file.type.toLocaleLowerCase(); // 小米手机有时获取到的file.type为空 var tmpName = file.name.toLocaleLowerCase(); var tmpIndex = tmpName.lastIndexOf(\'.\') + 1; if (!tmpStr && tmpIndex) { // 检查后缀 var ext = tmpName.substr(tmpIndex); if (extStr.indexOf(ext) < 0) { showMsg($frm, \'文件"\' + file.name + \'"不是图片。\'); return false; } } if (tmpStr && tmpStr.indexOf("image") != 0) { //if (file.type.indexOf("image") != 0) { showMsg($frm, \'文件"\' + file.name + \'"不是图片。\'); return false; } if (file.size >= 3072000) { showMsg($frm, \'您这张"\' + file.name + \'"图片大小过大,应小于3M\'); return false; } } for (var i = 0, file; file = files[i]; i++) { $(\'.btnSubmit\').attr(\'disabled\', \'disabled\'); var faphoto = $(\'.faphoto-pop\', $frm); faphoto.show(); list = \'<li class="thumb" cname="0"><div class="img"><span><i class="icon-load"></i><img class="success" style="display:none;" style="-webkit-transform-origin: 0px 0px; opacity: 1; -webkit-transform: scale(1, 1);"\'; list += \'src="" xwidth="300" xheight="330"></span></div>\'; list += \'<a class="clear" href="javascript:;"><i class="icon icon-clear"></i></a>\'; list += \'</li>\'; faphoto.find(\'.opt\').before(list); } for (var i = 0, file; file = files[i]; i++) { var form = new FormData(); form.append("image", file); new IO({ url: "http://9night.kimiss.com/m/?c=Mobile_Thread&a=upload" , contentType: false , processData: false , data: form , type: \'post\' , dataType: \'json\' , beforeSend: function(xhr) { // 上传监听 upload console.log(xhr.getNativeXhr()); xhr.getNativeXhr().upload.addEventListener(\'progress\', function(ev) { S.log({\'loaded\': ev.loaded, \'total\': ev.total}); }); } , success: function(data) { $(\'.btnSubmit\').removeAttr(\'disabled\'); if (data.error) { clearMsg($frm); showMsg($frm, data.message); // 移除旋转的块 faphoto.find(\'.thumb .img span .icon-load\').parent().parent().parent().remove(); return false; } newUrl = data.url[0]; arrUrl.push(newUrl); imgUrlsInput.val(arrUrl.join(\',\')); list = \'<img class="success" style="-webkit-transform-origin: 0px 0px; opacity: 1; -webkit-transform: scale(1, 1);"\'; list += \'src="\' + newUrl + \'" xwidth="300" xheight="330">\'; faphoto.find(\'.thumb .img span .icon-load\').parent().last().html(list); var imgUrlsNum = imgUrlsInput.val().split(\',\').length; // 记录Offline中 if ($(\'#mianImgUrls\').val()) S.Offline.setItem(imgs_data_offline_key, $(\'#mianImgUrls\').val(), 24 * 60 * 60 * 1000); if (imgUrlsNum == 8) { $(\'.opt\').hide(); } else { $(\'.opt\').show(); } } }); } }); } function compressUploadImg() { $("input[type=file]").change(function(e) { var arrUrl = []; var files = e.target.files || e.dataTransfer.files; var $frm = $(this).parents(\'div[data-form]\'); var imgUrlsInput = $(\'input[name=imgUrls]\', $frm); var newUrl = list = \'\'; clearMsg($frm); var imgUrls = imgUrlsInput.val(); if (imgUrls) arrUrl = imgUrls.split(\',\'); if (files.length + arrUrl.length > 8) { showMsg($frm, \'图片最多上传8张\'); return false; } // 验证图片大小格式 // 小米手机有时获取到的file.type为空 for (var i = 0, file; file = files[i]; i++) { var tmpStr = file.type.toLocaleLowerCase(); var tmpName = file.name.toLocaleLowerCase(); var tmpIndex = tmpName.lastIndexOf(\'.\') + 1; if (!tmpStr && tmpIndex) { // 检查后缀 var ext = tmpName.substr(tmpIndex); if (extStr.indexOf(ext) < 0) { showMsg($frm, \'文件"\' + file.name + \'"不是图片。\'); return false; } } if (tmpStr && tmpStr.indexOf("image") != 0) { showMsg($frm, \'文件"\' + file.name + \'"不是图片。\'); return false; } } // 上传的图片占位 for (var i = 0, file; file = files[i]; i++) { $(\'.btnSubmit\').attr(\'disabled\', \'disabled\'); var faphoto = $(\'.faphoto-pop\', $frm); faphoto.show(); list = \'<li class="thumb" cname="0"><div class="img"><span><i class="icon-load"></i><img class="success" style="display:none;" style="-webkit-transform-origin: 0px 0px; opacity: 1; -webkit-transform: scale(1, 1);"\'; list += \'src="" xwidth="300" xheight="330"></span></div>\'; list += \'<a class="clear" href="javascript:;"><i class="icon icon-clear"></i></a>\'; list += \'</li>\'; faphoto.find(\'.opt\').before(list); } // 上传图片 for (var i = 0, file; file = files[i]; i++) { var fileReader = new FileReader(); var _file = file; var fileType = _file.type || \'\'; if (!fileType) { var tmpName = _file.name.toLocaleLowerCase(); var tmpIndex = tmpName.lastIndexOf(\'.\') + 1; if (tmpIndex) { // 检查后缀 var ext = tmpName.substr(tmpIndex); fileType = extMimeMatch[ext]; } }
// 获取图片旋转角度 - 照相机拍照时有。需要把图片转正 var imgOrientation = 0; EXIF.getData(_file, function() { imgOrientation = EXIF.getTag(this, \'Orientation\'); imgOrientation = imgOrientation == undefined ? 0 : imgOrientation; }); fileReader.readAsDataURL(_file); fileReader.onload = function(event) { var result = event.target.result; //返回的dataURL var image = new Image(); image.src = result; image.onload = function() { //创建一个image对象,给canvas绘制使用 var cvs = document.createElement(\'canvas\'); var scale = 1; if (this.width > 750) { //1000只是示例,可以根据具体的要求去设定 if (this.width > this.height) { scale = 750 / this.width; } else { scale = 750 / this.height; } } cvs.width = this.width * scale; cvs.height = this.height * scale; //计算等比缩小后图片宽高 var ctx = cvs.getContext(\'2d\'); ctx.drawImage(this, 0, 0, cvs.width, cvs.height); var newImageData = cvs.toDataURL(fileType, 0.8); //重新生成图片,<span style="font-family: Arial, Helvetica, sans-serif;">fileType为用户选择的图片类型</span> var sendData = newImageData; if (sendData.length > 3072000) { faphoto.find(\'.thumb .img span .icon-load\').parent().parent().parent().remove(); showMsg($frm, \'您这张"\' + _file.name + \'"图片大小过大,应小于3M.\'); return false; } uploadCanvasImg(sendData, imgOrientation, $frm, arrUrl, newUrl, imgUrlsInput, list, faphoto); } } } }); } function uploadCanvasImg(imgData, imgOrientation, objDatafrm, arrUrl, newUrl, imgUrlsInput, list, faphoto) { var $frm = objDatafrm; var params = { \'imgData\': imgData, \'imgOrientation\': imgOrientation, }; $.ajax({ url: "http://9night.kimiss.com/m/?c=Mobile_Thread&a=CanvasUpload" , data: params , type: \'post\' , dataType: \'json\' , beforeSend: function(xhr) { // 上传监听 upload // xhr.getNativeXhr().upload.addEventListener(\'progress\', function(ev) { // S.log({\'loaded\': ev.loaded, \'total\': ev.total}); // }); } , success: function(data) { $(\'.btnSubmit\').removeAttr(\'disabled\'); if (!data.ok) { clearMsg($frm); showMsg($frm, data.msg); // 移除旋转的块 faphoto.find(\'.thumb .img span .icon-load\').parent().parent().parent().remove(); return false; } newUrl = data.msg.il; arrUrl.push(newUrl); imgUrlsInput.val(arrUrl.join(\',\')); list = \'<img class="success" style="-webkit-transform-origin: 0px 0px; opacity: 1; -webkit-transform: scale(1, 1);"\'; list += \'src="\' + newUrl + \'" xwidth="300" xheight="330">\'; faphoto.find(\'.thumb .img span .icon-load\').parent().last().html(list); var imgUrlsNum = imgUrlsInput.val().split(\',\').length; // 记录Offline中 if ($(\'#mianImgUrls\').val()) S.Offline.setItem(imgs_data_offline_key, $(\'#mianImgUrls\').val(), 24 * 60 * 60 * 1000); if (imgUrlsNum == 8) { $(\'.opt\').hide(); } else { $(\'.opt\').show(); } } }); }