通过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 相关文章推荐
html的DOM中document对象forms集合用法实例
Jan 21 Javascript
如何根据百度地图计算出两地之间的驾驶距离(两种语言js和C#)
Oct 29 Javascript
JavaScript学习小结之使用canvas画“哆啦A梦”时钟
Jul 24 Javascript
微信小程序 navbar实例详解
May 11 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
Feb 01 Javascript
webpack4的迁移的使用方法
May 25 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
Aug 13 Javascript
vue二级菜单导航点击选中事件的方法
Sep 12 Javascript
说说如何利用 Node.js 代理解决跨域问题
Apr 22 Javascript
node获取客户端ip功能简单示例
Aug 24 Javascript
vue路由守卫,限制前端页面访问权限的例子
Nov 11 Javascript
React冒泡和阻止冒泡的应用详解
Aug 18 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
合作指挥官:孟斯克
2020/03/16 星际争霸
PHP MemCached 高级缓存应用代码
2010/08/05 PHP
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
php天翼开放平台短信发送接口实现方法
2014/12/22 PHP
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
没有document.getElementByName方法
2013/08/19 Javascript
js函数定时器实现定时读取系统实时连接数
2014/04/30 Javascript
jQuery中Ajax全局事件引用方式及各个事件(全局/局部)执行顺序
2016/06/02 Javascript
jQuery EasyUI提交表单验证
2016/07/19 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
微信小程序 前端源码逻辑和工作流详解
2016/10/08 Javascript
vue双向数据绑定原理探究(附demo)
2017/01/17 Javascript
xmlplus组件设计系列之树(Tree)(9)
2017/05/02 Javascript
Vue计算属性的使用
2017/08/04 Javascript
微信小程序用户自定义模版用法实例分析
2017/11/28 Javascript
vue-cli实现多页面多路由的示例代码
2018/01/30 Javascript
Vue2.0 给Tab标签页和页面切换过渡添加样式的方法
2018/03/13 Javascript
js观察者模式的弹幕案例
2020/11/23 Javascript
[36:05]DOTA2亚洲邀请赛 3.31 小组赛 A组 Liquid vs Optic
2018/04/01 DOTA
python登录豆瓣并发帖的方法
2015/07/08 Python
约瑟夫问题的Python和C++求解方法
2015/08/20 Python
python实现批量监控网站
2016/09/09 Python
详解Python安装scrapy的正确姿势
2018/06/26 Python
Python 中的lambda函数介绍
2018/10/10 Python
Python 2种方法求某个范围内的所有素数(质数)
2020/01/31 Python
Pycharm连接gitlab实现过程图解
2020/09/01 Python
python re.match()用法相关示例
2021/01/27 Python
详解CSS3媒体查询响应式布局bootstrap 框架原理实战(推荐)
2020/11/16 HTML / CSS
HTML5不支持标签和新增标签详解
2016/06/27 HTML / CSS
印尼美容产品购物网站:PerfectBeauty.id
2017/12/01 全球购物
We Fashion荷兰:一家国际时装公司
2018/04/18 全球购物
家长给老师的道歉信
2014/01/13 职场文书
二年级学生评语大全
2014/04/23 职场文书
《闻一多先生的说和做》教学反思
2014/04/28 职场文书
大学军训通讯稿(2016最新版)
2015/12/21 职场文书
MySQL 数据库 增删查改、克隆、外键 等操作
2022/05/11 MySQL