通过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对象之JS入门之Array对象操作小结
Jan 09 Javascript
基于Jquery的跨域传输数据(JSONP)
Mar 10 Javascript
使用jQuery清空file文件域的解决方案
Apr 12 Javascript
jquery移动listbox的值原理及代码
May 03 Javascript
javascript获取form里的表单元素的示例代码
Feb 14 Javascript
js中函数调用的两种常用方法使用介绍
Jul 17 Javascript
js判断文本框剩余可输入字数的方法
Feb 04 Javascript
论Bootstrap3和Foundation5网格系统的异同
May 16 Javascript
jquery实现拖动效果(代码分享)
Jan 25 Javascript
JavaScript 性能提升之路(推荐)
Apr 10 Javascript
ES6中的迭代器、Generator函数及Generator函数的异步操作方法
May 12 Javascript
原生js实现购物车
Sep 23 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公用函数列表[正则]
2007/02/22 PHP
PHP下用rmdir实现删除目录的三种方法小结
2008/04/20 PHP
PHP项目开发中最常用的自定义函数整理
2010/12/02 PHP
php笔记之:数据类型与常量的使用分析
2013/05/14 PHP
PHP 将dataurl转成图片image方法总结
2016/10/14 PHP
PHP实现的简单留言板功能示例【基于thinkPHP框架】
2018/12/07 PHP
浅谈laravel-admin的sortable和orderby使用问题
2019/10/03 PHP
Javascript 设计模式(二) 闭包
2010/05/26 Javascript
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
JavaScript 弹出子窗体并返回结果到父窗体的实现代码
2016/05/28 Javascript
基于jQuery下拉选择框插件支持单选多选功能代码
2016/06/07 Javascript
常用Javascript函数与原型功能收藏(必看篇)
2016/10/09 Javascript
BootStrap table删除指定行的注意事项(笔记整理)
2017/02/05 Javascript
详解webpack进阶之插件篇
2017/07/06 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
JS动画定时器知识总结
2018/03/23 Javascript
详解ES6 系列之异步处理实战
2018/10/26 Javascript
微信小程序常用的3种提示弹窗实现详解
2019/09/19 Javascript
JavaScript字符和ASCII实现互相转换
2020/06/03 Javascript
完美解决vue 中多个echarts图表自适应的问题
2020/07/19 Javascript
javascript实现移动端轮播图
2020/12/09 Javascript
Python随机生成带特殊字符的密码
2016/03/02 Python
Python实现的简单模板引擎功能示例
2017/09/02 Python
Django使用Celery异步任务队列的使用
2018/03/13 Python
python使用RNN实现文本分类
2018/05/24 Python
python小程序实现刷票功能详解
2019/07/17 Python
Python在OpenCV里实现极坐标变换功能
2019/09/02 Python
python tkinter基本属性详解
2019/09/16 Python
python使用re模块爬取豆瓣Top250电影
2020/10/20 Python
Python 调用 ES、Solr、Phoenix的示例代码
2020/11/23 Python
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
日本热销NO.1胶原蛋白冻:Aishitoto爱希特多
2019/06/20 全球购物
小学后勤管理制度
2014/01/14 职场文书
幼儿园教师工作总结2015
2015/04/02 职场文书
创建文明城市倡议书
2015/04/28 职场文书
七年级作文之雪景
2019/11/18 职场文书