首页 > 开发 > PHP > 正文

php处理多图上传压缩代码功能

2024-05-04 22:42:57
字体:
来源:转载
供稿:网友

网上看了一些资料,关于处理图片压缩的,找到的大部分是单图压缩的,要么是单前端或者后端的,所以就自己整了下前后端压缩,并支持多图的压缩图片实例。代码有点多,直接复制到编辑器看会比较清楚

1、先创建的一个简单的上传页面upload.php。先通过前端代码压缩图片,直接上代码

<!DOCTYPE html><html><head>  <meta charset="UTF-8">  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no, minimal-ui">  <title>实名验证</title>  <script type="text/javascript">    /*    三个参数    file:一个是文件(类型是图片格式),    w:一个是文件压缩的后宽度,宽度越小,字节越小    objDiv:一个是容器或者回调函数    photoCompress()     */    function photoCompress(file,w,objDiv){      var ready=new FileReader();      /*开始读取指定的Blob对象或File对象中的内容. 当读取操作完成时,readyState属性的值会成为DONE,如果设置了onloadend事件处理程序,则调用之.同时,result属性中将包含一个data: URL格式的字符串以表示所读取文件的内容.*/      ready.readAsDataURL(file);      ready.onload=function(){        var re=this.result;        canvasDataURL(re,w,objDiv)      }    }    function canvasDataURL(path, obj, callback){      var img = new Image();      img.src = path;      img.onload = function(){        var that = this;        // 默认按比例压缩        var w = that.width,          h = that.height,          scale = w / h;        w = obj.width || w;        h = obj.height || (w / scale);        var quality = 0.7; // 默认图片质量为0.7        //生成canvas        var canvas = document.createElement('canvas');        var ctx = canvas.getContext('2d');        // 创建属性节点        var anw = document.createAttribute("width");        anw.nodeValue = w;        var anh = document.createAttribute("height");        anh.nodeValue = h;        canvas.setAttributeNode(anw);        canvas.setAttributeNode(anh);        ctx.drawImage(that, 0, 0, w, h);        // 图像质量        if(obj.quality && obj.quality <= 1 && obj.quality > 0){          quality = obj.quality;        }        // quality值越小,所绘制出的图像越模糊        var base64 = canvas.toDataURL('image/jpeg', quality);        // 回调函数返回base64的值        callback(base64);      }    }    /**     * 将以base64的图片url数据转换为Blob     * @param urlData     * 用url方式表示的base64图片数据     */    function convertBase64UrlToBlob(urlData){      var arr = urlData.split(','), mime = arr[0].match(/:(.*?);/)[1],        bstr = atob(arr[1]), n = bstr.length, u8arr = new Uint8Array(n);      while(n--){        u8arr[n] = bstr.charCodeAt(n);      }      return new Blob([u8arr], {type:mime});    }    var xhr;    //上传文件方法    function uploadClick() {      document.getElementsByClassName("uploadbtn")[0].value = '上传中...';      document.getElementsByClassName("uploadbtn")[0].disabled=true;       var obj = document.getElementsByClassName("myfile");      for(var i=0;i<2;i++){        UploadFile(obj[i].files[0],'file'+i);      }    }    function UploadFile(fileObj,filed){      var shopid = document.getElementById('shopid').value;      var adminid = document.getElementById('adminid').value;      var url = "newshimingupload.php"; // 接收上传文件的后台地址       var form = new FormData(); // FormData 对象      if(fileObj.size/1024 > 100) { //大于100k,进行压缩上传        photoCompress(fileObj, {          quality: 0.2        }, function(base64Codes){          //console.log("压缩后:" + base.length / 1024 + " " + base);          var bl = convertBase64UrlToBlob(base64Codes);          form.append("file", bl, "file_"+Date.parse(new Date())+".jpg"); // 文件对象          form.append("shopid", shopid); // 文件对象          form.append("adminid", adminid); // 文件对象          form.append("filed", filed); // 文件对象          xhr = new XMLHttpRequest(); // XMLHttpRequest 对象          xhr.open("post", url, false); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。          xhr.onload = uploadComplete; //请求完成          xhr.onerror = uploadFailed; //请求失败          // xhr.upload.onprogress = progressFunction;//【上传进度调用方法实现】          xhr.upload.onloadstart = function(){//上传开始执行方法            ot = new Date().getTime();  //设置上传开始时间            oloaded = 0;//设置上传开始时,以上传的文件大小为0          };          xhr.send(form); //开始上传,发送form数据        });      }else{ //小于等于1M 原图上传        form.append("file", fileObj); // 文件对象        form.append("shopid", shopid); // 文件对象        form.append("adminid", adminid); // 文件对象        form.append("filed", filed); // 文件对象        xhr = new XMLHttpRequest(); // XMLHttpRequest 对象        xhr.open("post", url, false); //post方式,url为服务器请求地址,true 该参数规定请求是否异步处理。        xhr.onload = uploadComplete; //请求完成        xhr.onerror = uploadFailed; //请求失败        xhr.upload.onloadstart = function(){//上传开始执行方法          ot = new Date().getTime();  //设置上传开始时间          oloaded = 0;//设置上传开始时,以上传的文件大小为0        };        xhr.send(form); //开始上传,发送form数据      }    }    //上传成功响应    function uploadComplete(evt) {      //服务断接收完文件返回的结果      var data = JSON.parse(evt.target.responseText);      console.log(data);      if(data.status){        alert(data.msg);        if(data.msg == '门店照上传成功'){          window.location.href = "/dd_admin/index.php";        }      }    }    //上传失败    function uploadFailed(evt) {      alert("网络不稳定,请重新上传!");    }  </script></head><body>  <style type="text/css">    .main{text-align: center;padding-top: 50px;}    .main .myfile{margin-bottom: 15px;}  </style><div class="main">  营业执照:  <input type="file" class="myfile" id="file1" name="file1" accept="image/x-png, image/jpg, image/jpeg, image/gif"/><br>  门店照:  <input type="file" class="myfile" id="file2" name="file2" accept="image/x-png, image/jpg, image/jpeg, image/gif"/><br>  <input type="hidden" id="shopid" name="shopid" value="<?php echo $_GET['shopid']; ?>" maxlength="15">  <input type="hidden" id="adminid" name="adminid" value="<?php echo $_GET['adminid']; ?>" maxlength="15">  <input style="margin-top: 25px;" class="uploadbtn" type="button" onclick="uploadClick()" value="上传" /><br></div></body></html>2、前端图片压缩后,请求到自定义的接口upload_deal.php.代码如下<?phprequire_once('public_func.php');  actionUpload('uploads/','file'); //参数分别代表图片存储的路径和上传的文件名}3、在第二部引入public_func.php,这块代码主要是对后端处理图片压缩function actionUpload($path = '/uploads/',$filename='myFile')  {    // $path = 'uploads/';  //图片存放根目录 根据自己项目路径而定    $file = $_FILES[$filename]['name'];    $folder = $path.date('Ymd')."/";    $pre = rand(999,9999).time();    $ext = strrchr($file,'.');    $newName = $pre.$ext;    $out = array(      'msg'=>'',      'status'=>'error',      'img_url'=>''    );    if(!is_dir($folder))    {      if(!mkdir($folder, 0777, true)){        $out['msg'] = '图片目录创建失败!';        echo json_encode($out);        exit;      }    }    $im = $_FILES[$filename]['tmp_name']; //上传图片资源    $maxwidth="1056"; //设置图片的最大宽度    $maxheight="500"; //设置图片的最大高度    $imgname = $folder.$newName; //图片存放路径 根据自己图片路径而定    $filetype=$_FILES[$filename]['type'];//图片类型    $result = thumbImage($im,$maxwidth,$maxheight,$imgname,$filetype);    if($result){      $out['msg'] = '图片上传成功';      $out['status'] = 'success';      $out['img_url'] = $folder.$newName;    }else{      $out['msg'] = '图片上传失败';    }    return json_encode($out);    exit;  }  //压缩图片  function thumbImage($im,$maxwidth,$maxheight,$name,$filetype)  {    switch ($filetype) {         case 'image/pjpeg':         case 'image/jpeg':           $im = imagecreatefromjpeg($im);  //PHP图片处理系统函数        break;         case 'image/gif':           $im = imagecreatefromgif($im);          break;         case 'image/png':           $im = imagecreatefrompng($im);          break;      case 'image/wbmp':           $im = imagecreatefromwbmp($im);          break;           }     $resizewidth_tag = $resizeheight_tag = false;    $pic_width = imagesx($im);    $pic_height = imagesy($im);    if(($maxwidth && $pic_width > $maxwidth) || ($maxheight && $pic_height > $maxheight))    {  $resizewidth_tag = $resizeheight_tag = false;      if($maxwidth && $pic_width>$maxwidth)      {        $widthratio = $maxwidth / $pic_width;        $resizewidth_tag = true;      }      if($maxheight && $pic_height>$maxheight)      {        $heightratio = $maxheight / $pic_height;        $resizeheight_tag = true;      }      if($resizewidth_tag && $resizeheight_tag)      {        if($widthratio < $heightratio)         $ratio = $widthratio;        else         $ratio = $heightratio;      }      if($resizewidth_tag && !$resizeheight_tag)      $ratio = $widthratio;      if($resizeheight_tag && !$resizewidth_tag)      $ratio = $heightratio;      $newwidth = $pic_width * $ratio;      $newheight = $pic_height * $ratio;      if(function_exists("imagecopyresampled"))      {        $newim = imagecreatetruecolor($newwidth,$newheight);//PHP图片处理系统函数        imagecopyresampled($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);//PHP图片处理系统函数      }      else      {        $newim = imagecreate($newwidth,$newheight);        imagecopyresized($newim,$im,0,0,0,0,$newwidth,$newheight,$pic_width,$pic_height);      }      switch ($filetype) {           case 'image/pjpeg' :           case 'image/jpeg' :             $result = imagejpeg($newim,$name);            break;           case 'image/gif' :             $result = imagegif($newim,$name);            break;           case 'image/png' :             $result = imagepng($newim,$name);            break;        case 'image/wbmp' :             $result = imagewbmp($newim,$name);            break;             }       imagedestroy($newim);    }    else    {      switch ($filetype) {           case 'image/pjpeg' :           case 'image/jpeg' :             $result = imagejpeg($im,$name);            break;           case 'image/gif' :             $result = imagegif($im,$name);            break;           case 'image/png' :             $result = imagepng($im,$name);            break;        case 'image/wbmp' :             $result = imagewbmp($im,$name);            break;             }    }    return $result;   }            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表