通过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 相关文章推荐
为Extjs加加速(javascript加速)
Aug 19 Javascript
用JQuery在网页中实现分隔条功能的代码
Aug 09 Javascript
JS获取地址栏参数的几种方法小结
Feb 28 Javascript
js实现拖拽效果(构造函数)
Dec 14 Javascript
JavaScript实现多种排序算法
Feb 24 Javascript
javascript实现获取图片大小及图片等比缩放的方法
Nov 24 Javascript
bootstrap table插件的分页与checkbox使用详解
Jul 23 Javascript
深入浅析Vue.js计算属性和侦听器
May 05 Javascript
Vue axios设置访问基础路径方法
Sep 19 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
Dec 03 Javascript
微信小程序的开发范式BeautyWe.js入门详解
Jul 10 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
Sep 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
PHP中创建并处理图象
2006/10/09 PHP
全世界最小的php网页木马一枚 附PHP木马的防范方法
2009/10/09 PHP
深入理解ob_flush和flush的区别(ob_flush()与flush()使用方法)
2013/02/06 PHP
phpQuery占用内存过多的处理方法
2013/11/13 PHP
php访问数组最后一个元素的函数end()用法
2015/03/18 PHP
PHP中使用foreach()遍历二维数组的简单实例
2016/06/13 PHP
PHP实现基于回溯法求解迷宫问题的方法详解
2017/08/17 PHP
JQuery 返回布尔值Is()条件判断方法代码
2012/05/14 Javascript
Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结
2013/11/14 Javascript
ie下$.getJSON出现问题的解决方法
2014/02/12 Javascript
setTimeout()递归调用不加引号出错的解决方法
2014/09/05 Javascript
JavaScript对JSON数据进行排序和搜索
2017/07/24 Javascript
vue.js响应式原理解析与实现
2020/06/22 Javascript
详解React项目中碰到的IE问题
2019/03/14 Javascript
微信小程序实现锚点功能
2019/11/20 Javascript
微信小程序全选多选效果实现代码解析
2020/01/21 Javascript
浅谈vue.watch的触发条件是什么
2020/11/07 Javascript
JavaScript 实现继承的几种方式
2021/02/19 Javascript
Python的subprocess模块总结
2014/11/07 Python
Python部署web开发程序的几种方法
2017/05/05 Python
Python实现小数转化为百分数的格式化输出方法示例
2017/09/20 Python
使用Python的Django和layim实现即时通讯的方法
2018/05/25 Python
Python wxPython库使用wx.ListBox创建列表框示例
2018/09/03 Python
使用Keras加载含有自定义层或函数的模型操作
2020/06/10 Python
Python openpyxl模块实现excel读写操作
2020/06/30 Python
解决TensorFlow训练模型及保存数量限制的问题
2021/03/03 Python
巴西男士个人护理产品商店:SHOP4MEN
2017/08/07 全球购物
博朗(Braun)俄罗斯官方商店:德国小家电品牌
2019/09/24 全球购物
测试驱动开发的主要步骤是什么
2014/12/10 面试题
企划主管岗位职责
2013/12/12 职场文书
志愿者活动总结范文
2014/04/26 职场文书
员工工作自我评价
2014/09/26 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
详解Js模块化的作用原理和方案
2021/04/29 Javascript
如何解决.cuda()加载用时很长的问题
2021/05/24 Python
Win10鼠标宏怎么设置?win10系统鼠标宏的设置方法
2022/08/14 数码科技