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

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

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.代码如下
<?php
require_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; 
  }

总结

以上所述是小编给大家介绍的php处理多图上传压缩代码功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对免费资源网网站的支持!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容