通过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 相关文章推荐
百度 popup.js 完美修正版非常的不错 脚本之家推荐
Apr 17 Javascript
js类定义函数时用prototype与不用的区别示例介绍
Jun 10 Javascript
jQuery实现自定义下拉列表
Jan 05 Javascript
基于Jquery实现表单验证
Jul 20 Javascript
理解Javascript的call、apply
Dec 16 Javascript
js只执行1次的函数示例
Jul 20 Javascript
原生JS实现不断变化的标签
May 22 Javascript
jQuery ajax读取本地json文件的实例
Oct 31 jQuery
Angular5中调用第三方js插件的方法
Feb 26 Javascript
layui数据表格重载实现往后台传参
Nov 15 Javascript
vue 自定指令生成uuid滚动监听达到tab表格吸顶效果的代码
Sep 16 Javascript
利用JS判断元素是否为数组的方法示例
Jan 08 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解析html类库simple_html_dom(详细介绍)
2013/07/05 PHP
使用PHP导出Word文档的原理和实例
2013/10/21 PHP
JavaScript字符串对象substring方法入门实例(用于截取字符串)
2014/10/17 Javascript
使用JavaScript刷新网页的方法
2015/06/04 Javascript
javascript实现输出指定行数正方形图案的方法
2015/08/03 Javascript
Javascript页面跳转常见实现方式汇总
2015/11/28 Javascript
javascript显示上周、上个月日期的处理方法
2016/02/03 Javascript
javascript实现查找数组中最大值方法汇总
2016/02/13 Javascript
JS实战篇之收缩菜单表单布局
2016/12/10 Javascript
canvas绘制表盘时钟
2017/01/23 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
JavaScript实现移动端轮播效果
2017/06/06 Javascript
ES6扩展运算符用法实例分析
2017/10/31 Javascript
angularjs结合html5实现拖拽功能
2018/06/25 Javascript
Vue2.0中三种常用传值方式(父传子、子传父、非父子组件传值)
2018/08/16 Javascript
uniapp微信小程序:key失效的解决方法
2021/01/20 Javascript
python数据结构之二叉树的建立实例
2014/04/29 Python
python判断一个集合是否包含了另外一个集合中所有项的方法
2015/06/30 Python
Python初学时购物车程序练习实例(推荐)
2017/08/08 Python
Python入门之后再看点什么好?
2018/03/05 Python
python爬虫实现中英翻译词典
2019/06/25 Python
python3字符串操作总结
2019/07/24 Python
使用Pytorch搭建模型的步骤
2020/11/16 Python
Python爬虫之Selenium多窗口切换的实现
2020/12/04 Python
深入剖析HTML5 内联框架iFrame
2016/05/04 HTML / CSS
介绍下Java中==和equals的区别
2013/09/01 面试题
组工干部演讲稿
2014/09/02 职场文书
城市规划应届生推荐信
2014/09/08 职场文书
机械制造专业大学生自我鉴定
2014/09/19 职场文书
镇党委书记群众路线整改措施思想汇报
2014/10/13 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
公务员个人总结
2015/02/12 职场文书
会议室管理制度范本
2015/08/06 职场文书
民事调解协议书
2016/03/21 职场文书
MySQL中distinct和count(*)的使用方法比较
2021/05/26 MySQL
python中subplot大小的设置步骤
2021/06/28 Python