通过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 相关文章推荐
禁止js文件缓存的代码
Apr 09 Javascript
浅析JavaScript中的类型和对象
Nov 29 Javascript
js的toUpperCase方法用法实例
Jan 27 Javascript
微信支付如何实现内置浏览器的H5页面支付
Sep 25 Javascript
JavaScript的字符串方法汇总
Jul 31 Javascript
bootstrapfileinput实现文件自动上传
Nov 08 Javascript
浅谈js中function的参数默认值
Feb 20 Javascript
AngularJs导出数据到Excel的示例代码
Aug 11 Javascript
动态创建Angular组件实现popup弹窗功能
Sep 15 Javascript
20个最常见的jQuery面试问题及答案
May 23 jQuery
怎么理解wx.navigateTo的events参数使用详情
May 18 Javascript
Vue 防止短时间内连续点击后多次触发请求的操作
Nov 11 Javascript
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
ecshop 批量上传(加入自定义属性)
2012/03/20 PHP
初识php MVC
2014/09/10 PHP
php+mysqli实现批量替换数据库表前缀的方法
2014/12/29 PHP
部署PHP时的4个配置修改说明
2015/10/19 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
关于js中window.location.href,location.href,parent.location.href,top.location.href的用法与区别
2010/10/18 Javascript
JavaScript 判断用户输入的邮箱及手机格式是否正确
2013/12/08 Javascript
JavaScript对象之深度克隆介绍
2014/12/08 Javascript
jQuery插件jPaginate实现无刷新分页
2015/05/04 Javascript
javascript返回顶部的按钮实现方法
2016/01/09 Javascript
学习使用jquery iScroll.js移动端滚动条插件
2020/03/24 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
微信JSAPI Ticket接口签名详解
2020/06/28 Javascript
Angular使用cli生成自定义文件、组件的方法
2018/09/04 Javascript
jquery实现拖拽添加元素功能
2020/12/01 jQuery
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
解析Python中的__getitem__专有方法
2016/06/27 Python
flask使用session保存登录状态及拦截未登录请求代码
2018/01/19 Python
对python中Matplotlib的坐标轴的坐标区间的设定实例讲解
2018/05/25 Python
python退出命令是什么?详解python退出方法
2018/12/10 Python
在django中实现页面倒数几秒后自动跳转的例子
2019/08/16 Python
Python 类,property属性(简化属性的操作),@property,property()用法示例
2019/10/12 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
Python3 selenium 实现QQ群接龙自动化功能
2020/04/17 Python
蔻驰法国官网:COACH法国
2018/11/14 全球购物
美国轻奢时尚购物网站:REVOLVE(支持中文)
2020/07/18 全球购物
企划主管岗位职责
2013/12/12 职场文书
中学生学雷锋活动心得体会
2014/03/10 职场文书
期末个人总结范文
2015/02/13 职场文书
地道战观后感500字
2015/06/04 职场文书
毕业班工作总结
2015/08/10 职场文书
涨工资申请书应该怎么写?
2019/07/08 职场文书
python制作图形界面的2048游戏, 基于tkinter
2021/04/06 Python
十大最强格斗系宝可梦,超梦X仅排第十,第二最重格斗礼仪
2022/03/18 日漫
Nginx配置之禁止指定IP访问
2022/05/02 Servers