前端裁剪图片并上传的做法整理

H5页面写法

<!DOCTYPE html>
<html>
<body>
<input type="file" name="file" id="file" /> 
<script>
var eleFile = document.querySelector('#file');
// 压缩图片需要的一些元素和对象 var reader = new FileReader(), img = new Image(); // 选择的文件对象 var file = null; // 缩放图片需要的canvas var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); // base64地址图片加载完毕后 img.onload = function () { // 图片原始尺寸 var originWidth = this.width; var originHeight = this.height; // 最大尺寸限制 var maxWidth = 400, maxHeight = 400; // 目标尺寸 var targetWidth = originWidth, targetHeight = originHeight; // 图片尺寸超过400x400的限制 if (originWidth > maxWidth || originHeight > maxHeight) { if (originWidth / originHeight > maxWidth / maxHeight) { // 更宽,按照宽度限定尺寸 targetWidth = maxWidth; targetHeight = Math.round(maxWidth * (originHeight / originWidth)); } else { targetHeight = maxHeight; targetWidth = Math.round(maxHeight * (originWidth / originHeight)); } } // canvas对图片进行缩放 canvas.width = targetWidth; canvas.height = targetHeight; // 清除画布 context.clearRect(0, 0, targetWidth, targetHeight); // 图片压缩 context.drawImage(img, 0, 0, targetWidth, targetHeight); // canvas转为blob并上传 canvas.toBlob(function (blob) { // 图片ajax上传 var xhr = new XMLHttpRequest(); // 文件上传成功 xhr.onreadystatechange = function() { if (xhr.status == 200) { // xhr.responseText就是返回的数据 } }; // 开始上传 xhr.open("POST", 'pc.php', true); xhr.send(blob); },'image/png'); // }, file.type || 'image/png'); }; // 文件base64化,以便获知图片原始尺寸 reader.onload = function(e) { img.src = e.target.result; }; eleFile.addEventListener('change', function (event) { file = event.target.files[0]; // 选择的文件是图片 if (file.type.indexOf("image") == 0) { reader.readAsDataURL(file); } }); </script> </body> </html>

  

php代码

<?php
$data = file_get_contents("php://input");
file_put_contents("test.png",$data);
?>

  

wxapp写法

function uploadimg(data, urls, funsuccess, funerror ,_this){
  var that=this;
  var i=data.i?data.i:0;
  var success=data.success?data.success:0;
  var fail=data.dail?data.fail:0;
  wx.getImageInfo({
    src: data.path[i],
    success: function (res) {
      console.log(res)
      var ctx = wx.createCanvasContext('photo_canvas');
      var ratio = 2;
      var canvasWidth = res.width
      var canvasHeight = res.height;
      // 保证宽高均在800以内
      while (canvasWidth > 800 || canvasHeight > 800) {
        //比例取整
        canvasWidth = Math.trunc(res.width / ratio)
        canvasHeight = Math.trunc(res.height / ratio)
        ratio = ratio+0.5;
      }
      _this.setData({
        canvasWidth: canvasWidth,
        canvasHeight: canvasHeight
      })//设置canvas尺寸
      ctx.drawImage(data.path[i], 0, 0, canvasWidth, canvasHeight)
      ctx.draw(false,function(){
          //下载canvas图片
          setTimeout(function () {
            wx.canvasToTempFilePath({
              canvasId: 'photo_canvas',
              fileType: 'jpg',
              destWidth: canvasWidth,
              destHeight: canvasHeight,
              quality: 1,
              success: function (res) {
                console.log(res)
                var tempFilePaths = res.tempFilePath
                wx.uploadFile({
                  url: data.url,
                  filePath: tempFilePaths,
                  name: data.name,
                  formData: data.formData,
                  success: (resp) => {
                    console.log(resp)
                    var resp = JSON.parse(resp.data);
                    if (resp.errcode == 0) {
                      success++;
                      urls.push(resp.data);
                      wx.showToast({
                        title: '上传完成第' + success + '张照片',
                        duration: 1000
                      });
                    } else {
                      fail++;
                      console.log('fail:' + i + "fail:" + fail);
                    }
                  },
                  fail: (res) => {
                    fail++;
                    console.log('fail:' + i + "fail:" + fail);
                  },
                  complete: () => {
                    i++;
                    if (i == data.path.length) { //当图片传完时,停止调用   
                      console.log('执行完毕');
                      console.log('成功:' + success + " 失败:" + fail);
                      if (fail == 0) {
                        funsuccess();
                      } else {
                        funerror();
                      }
                      return false;
                    } else {//若图片还没有传完,则继续调用函数
                      data.i = i;
                      data.success = success;
                      data.fail = fail;
                      that.uploadimg(data, urls, funsuccess, funerror,_this);
                    }
                  }
                });

              },
              fail: function (error) {
                console.log(error)
              }
            })
          }, 200)
      })
      
    }
  })
}

wxml代码

<canvas canvas-id="photo_canvas" style="width:{{canvasWidth}}px;height:{{canvasHeight}}px;position: absolute;left:-9999px;top:-9999px;"></canvas>

  

php代码

public function upload()
    {
        $uplad_tmp_name = $_FILES['imgfile']['tmp_name'];
        $uplad_name     = $_FILES['imgfile']['name'];
        
        $image_url      = "";
        //上传文件类型列表
        $uptypes        = array(
            'image/jpg',
            'image/jpeg',
            'image/png',
            'image/pjpeg',
            'image/gif',
            'image/bmp',
            'image/x-png'
        );
        //初始化变量
        $date           = date('ymdhis') . uniqid();
        //上传文件路径
        $img_url        = IMG_BASE_URL . date('ym') . "/";
        $img_url_data   = "data/images/" . date('ym') . "/";
        if (!is_dir($img_url_data)) {
            mkdir($img_url_data, 0777);
        }
        //如果当前图片不为空
        if (!empty($uplad_name) && in_array($_FILES["imgfile"]["type"],$uptypes)) {
            $uptype     = explode(".", $uplad_name);
            $newname    = $date . "." . end($uptype);
            $uplad_name = $newname;
            //如果上传的文件没有在服务器上存在
            if (!file_exists($img_url_data . $uplad_name)) {
                //把图片文件从临时文件夹中转移到我们指定上传的目录中
                $file = $img_url_data . $uplad_name;
                move_uploaded_file($uplad_tmp_name, $file);
                chmod($file, 0777);
               /* 
                include(LIB_PATH."/resize.class.php");
     			  $resizeObj = new resize($file);
     			  $resizeObj -> resizeImage(800, 9999999, 'auto');
     			  $resizeObj -> saveImage($file, 100);                
               */
                $img_url1 = $img_url . $newname;
                $this->ajax_info(0, $img_url1, '上传成功');
            }
        }
    }

  

posted @ 2018-11-17 14:31  良工心苦的菠萝阁  阅读(624)  评论(0编辑  收藏  举报