通过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 创建Dom元素
May 07 Javascript
JavaScript动态插入script的基本思路及实现函数
Nov 11 Javascript
jquery对ajax的支持介绍
Dec 10 Javascript
深入浅析同源策略和跨域访问
Nov 26 Javascript
JavaScript深度复制(deep clone)的实现方法
Feb 19 Javascript
关于js二维数组和多维数组的定义声明(详解)
Oct 02 Javascript
Angular Renderer (渲染器)的具体使用
May 03 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
Feb 27 jQuery
微信打开网址添加在浏览器中打开提示的办法
May 20 Javascript
node.js使用 http-proxy 创建代理服务器操作示例
Feb 10 Javascript
JavaScript变量Dom对象的所有属性
Apr 30 Javascript
vue使用better-scroll实现滑动以及左右联动
Jun 30 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/12/06 PHP
PHP 实现多服务器共享 SESSION 数据
2009/08/15 PHP
PHP实现变色验证码实例
2014/01/06 PHP
Yii2――使用数据库操作汇总(增删查改、事务)
2016/12/19 PHP
javascript管中窥豹 形参与实参浅析
2011/12/17 Javascript
jQuery使用hide方法隐藏页面上指定元素的方法
2015/03/30 Javascript
JavaScript实现模仿桌面窗口的方法
2015/07/18 Javascript
JS实现网站菜单拖拽移位效果的方法
2015/09/24 Javascript
JS导出PDF插件的方法(支持中文、图片使用路径)
2016/07/12 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
ionic2自定义cordova插件开发以及使用(Android)
2017/06/19 Javascript
深入理解ES6学习笔记之块级作用域绑定
2017/08/19 Javascript
重学 JS:为啥 await 不能用在 forEach 中详解
2019/04/15 Javascript
详解vue中使用微信jssdk
2019/04/19 Javascript
微信小程序绘制图片发送朋友圈
2019/07/25 Javascript
在VUE中实现文件下载并判断状态的方法
2019/11/08 Javascript
vue 实现通过vuex 存储值 在不同界面使用
2019/11/11 Javascript
使用Python编写Linux系统守护进程实例
2015/02/03 Python
Python简单调用MySQL存储过程并获得返回值的方法
2015/07/20 Python
Python基于select实现的socket服务器
2016/04/13 Python
Python中列表与元组的乘法操作示例
2018/02/10 Python
Python获取昨天、今天、明天开始、结束时间戳的方法
2018/06/01 Python
利用python-docx模块写批量生日邀请函
2019/08/26 Python
详解Python 实现 ZeroMQ 的三种基本工作模式
2020/03/24 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
基于Python的接口自动化读写excel文件的方法
2021/01/15 Python
十月份红领巾广播稿
2014/01/22 职场文书
税务职业生涯规划书范文
2014/09/16 职场文书
售房协议书范本2014
2014/10/23 职场文书
公司开会通知
2015/04/20 职场文书
让世界充满爱观后感
2015/06/10 职场文书
教育读书笔记
2015/07/02 职场文书
redis 查看所有的key方式
2021/05/07 Redis
Golang标准库syscall详解(什么是系统调用)
2021/05/25 Golang