通过js实现压缩图片上传功能


Posted in Javascript onFebruary 25, 2020

大概的流程就是

  • 点击file选择图片
  • js将图片解读出base64编码,然后通过js将base64编码转为压缩后的base64
  • 然后通过ajax或者form把压缩后的base64编码提交到服务器(php)
  • 然后php将base64写入文件

html

<!-- 首先引入jquery!!!!!!这里没有引入 -->


<img src="/Uploads/verifyinfo/cardz.png" style="width: 100%;height: 100%;">
<input id="cardz" name="cardz" class="weui-uploader__input" type="file" accept="image/*" multiple="">
<input type="hidden" id="cardzbase" name="cardzbase">


<script>
 $(function(){
  $("input[type=file]").on('change', function(){

   var filePath = $(this).val(),     //获取到input的value,里面是文件的路径
       fileFormat = filePath.substring(filePath.lastIndexOf(".")).toLowerCase(),
       fileObj = document.getElementById($(this).attr('id')).files[0]; //上传文件的对象,要这样写才行,用jquery写法获取不到对象

   var imgBase64str = '';   //存储图片的imgBase64
   // 检查是否是图片
   if( !fileFormat.match(/.png|.jpg|.jpeg/) ) {
    alert('上传错误,文件格式必须为:png/jpg/jpeg');
    return;
   }
   var that = this;
   // 调用函数,对图片进行压缩
   compress(fileObj,function(imgBase64){
    imgBase64str = imgBase64;//存储转换后的base64编码

    var reader = new FileReader();
    var img = $(that).prev("img")
    file = that.files[0]
    reader.addEventListener("load", function () {
     img.attr("src",imgBase64str);
     $("#"+$(that).attr('id')+"base").val(imgBase64str);
    }, false);
    reader.readAsDataURL(file)
   });



  })
  $("#uploadcard").on("click", function(){
   var cardzbase = $("#cardzbase").val();
   if (cardzbase.length<=0) {
    $.toast("请添加正面照");
    return;
   }
   $.post(
    "php路径",
    {
     cardzbase:cardzbase
    },
    function (data) {
     alert(data.msg);
    }
   );


  });
 })
 // 对图片进行压缩
 function compress(fileObj, callback){
  if ( typeof (FileReader) === 'undefined') {
   console.log("当前浏览器内核不支持base64图标压缩");
   //调用上传方式不压缩
   directTurnIntoBase64(fileObj,callback);
  } else {
   var reader = new FileReader();
   reader.onload = function (e) { //要先确保图片完整获取到,这是个异步事件


    var image = new Image();
    image.src=e.target.result;
    image.onload = function(){
     square = 0.2,  //定义画布的大小,也就是图片压缩之后的像素
         canvas = document.createElement('canvas'), //创建canvas元素
         context = canvas.getContext('2d'),
         imageWidth = Math.round(square*image.width),  //压缩图片的大小
         imageHeight = Math.round(square*image.height),
         data = '';

     canvas.width = imageWidth;
     canvas.height = imageHeight;
     context.clearRect(0, 0, imageWidth, imageHeight); //在给定矩形内清空一个矩形
     context.drawImage(this, 0, 0, imageWidth, imageHeight);
     var data = canvas.toDataURL('image/jpeg',0.6);
     //压缩完成执行回调

     callback(data);
    };
   };
   reader.readAsDataURL(fileObj);

  }
 }
 // 不对图片进行压缩,直接转成base64
 function directTurnIntoBase64(fileObj,callback){
  var r = new FileReader();
  // 转成base64
  r.onload = function(){
   //变成字符串
   imgBase64 = r.result;
   //console.log(imgBase64);
   callback(imgBase64);
  }
  r.readAsDataURL(fileObj);  //转成Base64格式
 }
</script>

php

<?php
/**
   * [将Base64图片转换为本地图片并保存]
   * @param $base64_image_content [要保存的Base64]
   * @param $path [要保存的路径]
   * @return bool|string
   */
  public function base64_image_content($base64_image_content,$path){
    //匹配出图片的格式
    if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
      $type = $result[2];
      //生成文件名
      $file_name = random_str(10).".{$type}";
      //路径和文件名拼接
      $local_file_url = $path.$file_name;
      if (file_put_contents($local_file_url, base64_decode(str_replace($result[1], '', $base64_image_content)))){
        return array("filename"=>$file_name,"path"=>$path,"filepath"=>$local_file_url);
      }else{
        return false;
      }
    }else{
      return false;
    }
  }

  public function uploadm()
  {
    $da['status'] = 0;
    if (IS_POST) {
      $infoz = I("post.cardzbase");
      if (!$infoz || !$infof) {
        // 上传错误提示错误信息
//        $this->error($upload->getError());
        $da['msg'] = "上传异常";
      } else {
        $infoz_info = $this->base64_image_content($infoz,"Uploads/verifyinfo/");
        if($infof_info==false){
          $da['msg'] = "上传失败";
        }else{
          //自己的业务...
        }
      }
    }else{
      $da['msg'] = "非法请求";
    }
    $this->ajaxReturn($da);
  }

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
document.body.scrollTop 值总为0的解决方法 比较常见的标准问题
Nov 30 Javascript
JS焦点图切换,上下翻转
May 12 Javascript
jquery解析XML字符串和XML文件的方法说明
Feb 21 Javascript
js数组操作常用方法
May 08 Javascript
js中一维数组和二位数组中的几个问题示例说明
Jul 17 Javascript
关于微信上网页图片点击全屏放大效果
Dec 19 Javascript
jQuery插件echarts实现的单折线图效果示例【附demo源码下载】
Mar 04 Javascript
原生JS实现导航下拉菜单效果
Nov 25 Javascript
JS查找数组中重复元素的方法详解
Jun 14 Javascript
node.js 微信开发之定时获取access_token
Feb 07 Javascript
Vue watch响应数据实现方法解析
Jul 10 Javascript
jQuery列表动态增加和删除的实现方法
Nov 05 jQuery
Vue实现简单计算器案例
Feb 25 #Javascript
使用Vue实现简单计算器
Feb 25 #Javascript
详解vue beforeEach 死循环问题解决方法
Feb 25 #Javascript
Vue实现简易计算器
Feb 25 #Javascript
js+canvas实现简单扫雷小游戏
Jan 22 #Javascript
Vue常用传值方式、父传子、子传父及非父子实例分析
Feb 24 #Javascript
es6中let和const的使用方法详解
Feb 24 #Javascript
You might like
索尼SONY SRF-S83/84电路分析和打磨
2021/03/02 无线电
php之对抗Web扫描器的脚本技巧
2008/10/01 PHP
PHP中冒号、endif、endwhile、endfor使用介绍
2010/04/28 PHP
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
部署PHP项目应该注意的几点事项分享
2013/12/20 PHP
PHP可变变量学习小结
2015/11/29 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
PHP合并两个或多个数组的方法
2019/01/20 PHP
Laravel 框架控制器 Controller原理与用法实例分析
2020/04/14 PHP
列表内容的选择
2006/06/30 Javascript
jQuery自定义动画函数实例详解(附demo源码)
2015/12/10 Javascript
AngularJS使用angular-formly进行表单验证
2015/12/27 Javascript
node.js微信公众平台开发教程
2016/03/04 Javascript
javascript和jQuery中的AJAX技术详解【包含AJAX各种跨域技术】
2016/12/15 Javascript
JS正则子匹配实例分析
2016/12/22 Javascript
JavaScript中使用参数个数实现重载功能
2017/09/01 Javascript
用JS编写一个函数,返回数组中重复出现过的元素(实例)
2017/09/14 Javascript
vue几个常用跨域处理方式介绍
2018/02/07 Javascript
vue2.0实现音乐/视频播放进度条组件
2018/06/06 Javascript
深入了解Hybrid App技术的相关知识
2019/07/17 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
node.js中对Event Loop事件循环的理解与应用实例分析
2020/02/14 Javascript
vue中实现点击变成全屏的多种方法
2020/09/27 Javascript
Numpy中矩阵matrix读取一列的方法及数组和矩阵的相互转换实例
2018/07/02 Python
python之Flask实现简单登录功能的示例代码
2018/12/24 Python
python DataFrame转dict字典过程详解
2019/12/26 Python
浅谈pytorch、cuda、python的版本对齐问题
2020/01/15 Python
Python爬取阿拉丁统计信息过程图解
2020/05/12 Python
css3实现背景模糊的三种方式(小结)
2020/05/15 HTML / CSS
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
过滤器的用法
2013/10/08 面试题
爱情保证书范文
2014/02/01 职场文书
初三学习计划书范文
2014/04/30 职场文书
幼儿园感谢信
2015/01/21 职场文书
社区服务活动报告
2015/02/05 职场文书
Python OpenCV之常用滤波器使用详解
2022/04/07 Python