前端HTML代码:
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>上传图片</title> <script type="text/javascript" src="./js/jquery-1.11.3.min.js"></script> </head> <body> <form method="post" enctype='multipart/form-data'> <input type="file" id="mypic" name="mypic" accept="image/*"> <input type="submit" id="tanchu"> </form> <script type="text/javascript"> $(function(){ var input = document.getElementById("mypic"); //$('#mypic').addEventListener('change',readFile,false);//此处不能用id选择器添加事件监听 input.addEventListener('change',readFile,false); function readFile(){ var file = this.files[0]; //这里我们判断下类型如果不是图片就返回 去掉就可以上传任意文件 if(!/image\/\w+/.test(file.type)){ alert("请确保文件为图像类型"); return false; } var reader = new FileReader(); reader.readAsDataURL(file); reader.onload = function () { compressImg(reader.result, function (res) { $.post( 'base64.php',//跳转的url {'IMAGE':res}, function(data){ //进行返回数据的处理 }, 'json' ) }); }; } //压缩图片 function compressImg(soureImg, callback) { self = this; var after = getByteLen(soureImg) / 1024; console.log('压缩前==>' + getByteLen(soureImg) / 1024 + 'kb'); console.log('压缩中...'); console.time('用时'); // 参数处理 var baseImg = soureImg; // 创建img var oImg = new Image(); oImg.src = baseImg; // 处理图片大小,宽度大于 1920则压缩大小为一半 var Iwidth; var Iheight; oImg.addEventListener('load', function (ev) { Iwidth = ev.target.width; Iheight = ev.target.height; if (Number(Iwidth) > 1920) { Iwidth = Iwidth / 2; Iheight = Iheight / 2; } // 创建canvas var canvas = document.createElement('canvas'); var cxt = canvas.getContext("2d"); canvas.width = Iwidth; canvas.height = Iheight; cxt.drawImage(oImg, 0, 0, Iwidth, Iheight); var canvasBase64 = canvas.toDataURL("image/jpeg", 0.5); callback(canvasBase64); // 垃圾回收 oImg = null; canvas = null; console.timeEnd('用时'); console.log('压缩后==>' + getByteLen(canvasBase64) / 1024 + 'kb'); console.log('转换率==>' + getByteLen(canvasBase64) / 1024 / after * 100 + '%'); }); } function getByteLen(str) { var l = str.length; var n = l; for (var i = 0; i < l; i++) { if (str.charCodeAt(i) < 0 || str.charCodeAt(i) > 255) { n++ } } return n } }) </script> </body> </html>
后台php处理代码
<?php header('Content-type:text/html;charset="utf-8"'); /*echo '<pre>'; print_r($_POST['IMAGE']);exit;*/ //利用这样的方式也能达到刷选出来数据的目的 /*$img = trim($_POST['IMAGE']); $jpg = explode('/', explode(';', $img)[0])[1]; $start=strpos($img,','); $img= substr($img,$start+1);*/ $base64_img = trim($_POST['IMAGE']); preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_img, $result); $type = $result[2]; if(in_array($type,array('pjpeg','jpeg','jpg','gif','bmp','png'))){ $path = './images'; if(!file_exists($path)){ mkdir($path,0777,true); } $file = uniqid();//基于以微秒计的当前时间,生成一个唯一的ID $fileName = $path .'/'. $file. '.' . $type; $img = str_replace($result[1], '', $base64_img); $img = str_replace(' ', '+', $img);//这一步要注意替换,要不然会出现乱码 $data = base64_decode($img); $success = file_put_contents($fileName, $data);//至此,图片已经上传成功,后续判断根据自己需求来更改 if($success){ $s_config['image_library'] = 'gd2'; $s_config['source_image'] = $path . '/' . $file . '.' .$type; $s_config['new_image'] = $path . '/s_' . $file . '.' .$type; $fileName_s = date('Ymd') . '/s_' . $file . '.' .$type; $s_config['create_thumb'] = true; $s_config['thumb_marker'] = ''; $s_config['maintain_ratio'] = true; $s_config['quality'] = 50; $s_config['width'] = 300; $s_config['height'] = 200; $this->load->library('image_lib', $s_config); $this->image_lib->resize(); echo json_encode(['data' => ['yt' =>$this->config->config['resources_img_url'] . $fileName, 'slt' => $this->config->config['resources_img_url'] . $fileName_s]]); }else{ echo json_encode(array('code'=>101,'msg'=>'上传失败')); } }else{ echo json_encode(array('code'=>101,'msg'=>'图片类型不符合')); }
