通过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 相关文章推荐
用jquery实现点击栏目背景色改变
Dec 10 Javascript
html+js实现动态显示本地时间
Sep 21 Javascript
jQuery中ajax和post处理json的不同示例对比
Nov 02 Javascript
JavaScript中模拟实现jsonp
Jun 19 Javascript
javascript日期处理函数,性能优化批处理
Sep 06 Javascript
使用EVAL处理jqchart jquery 折线图返回数据无效的解决办法
Nov 26 Javascript
如何判断Javascript对象是否存在的简单实例
May 18 Javascript
深究AngularJS之ui-router详解
Jun 13 Javascript
vue实现移动端input上传视频、音频
Aug 18 Javascript
js实现移动端图片滑块验证功能
Sep 29 Javascript
js实现简易拖拽的示例
Oct 26 Javascript
Vue Element-ui表单校验规则实现
Jul 09 Vue.js
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
受疫情影响 动画《Re从零开始的异世界生活》第二季延期至7月
2020/03/10 日漫
一个查看session内容的函数
2006/10/09 PHP
php开发微信支付获取用户地址
2015/10/04 PHP
PHP抽象类与接口的区别详解
2019/03/21 PHP
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
js利用prototype调用Array的slice方法示例
2014/06/09 Javascript
jquery+正则实现统一的表单验证
2015/09/20 Javascript
js添加千分位的实现代码(超简单)
2016/08/01 Javascript
详解微信小程序入门五: wxml文件引用、模版、生命周期
2017/01/20 Javascript
AngularJS中$http使用的简单介绍
2017/03/17 Javascript
微信小程序开发之麦克风动画 帧动画 放大 淡出
2017/04/18 Javascript
js使用i18n实现页面国际化的方法
2017/05/09 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
详解Vue一个案例引发「内容分发slot」的最全总结
2018/12/02 Javascript
小程序开发中如何使用async-await并封装公共异步请求的方法
2019/01/20 Javascript
vue移动端实现手机左右滑动入场动画
2020/06/17 Javascript
微信小程序事件流原理解析
2019/11/27 Javascript
javascript实现多边形碰撞检测
2020/10/24 Javascript
[01:00:04]DOTA2上海特级锦标赛B组小组赛#1 Alliance VS Spirit第二局
2016/02/26 DOTA
Python实现嵌套列表去重方法示例
2017/12/28 Python
Python实现监控Nginx配置文件的不同并发送邮件报警功能示例
2019/02/26 Python
python挖矿算力测试程序详解
2019/07/03 Python
python字典的setdefault的巧妙用法
2019/08/07 Python
解决Pycharm 包已经下载,但是运行代码提示找不到模块的问题
2019/08/31 Python
python破解bilibili滑动验证码登录功能
2019/09/11 Python
python selenium操作cookie的实现
2020/03/18 Python
如何理解Python中的变量
2020/06/01 Python
俄罗斯品牌服装和鞋子的在线商店:KUPIVIP
2019/10/27 全球购物
linux面试题参考答案(4)
2014/09/21 面试题
UNIX文件系统分类
2014/11/11 面试题
基层党组织整改方案
2014/10/25 职场文书
服装店员工管理制度
2015/08/07 职场文书
《法国号》教学反思
2016/02/22 职场文书
亲情作文之母爱
2019/09/25 职场文书
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL
Python+SeaTable实现计算两个日期间的工作日天数
2022/07/07 Python