通过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 相关文章推荐
javascript拓展DOM操作 prependChild insertAfert
Nov 17 Javascript
setInterval,setTimeout与jquery混用的问题
Apr 08 Javascript
在Ubuntu上安装最新版本的Node.js
Jul 14 Javascript
jQuery实现购物车数字加减效果
Mar 14 Javascript
Javascript计算二维数组重复值示例代码
Dec 18 Javascript
jQuery中clone()函数实现表单中增加和减少输入项
May 13 jQuery
20170918 前端开发周报之JS前端开发必看
Sep 18 Javascript
vue项目总结之文件夹结构配置详解
Dec 13 Javascript
微信小程序地图(map)组件点击(tap)获取经纬度的方法
Jan 10 Javascript
webpack-url-loader 解决项目中图片打包路径问题
Feb 15 Javascript
javascript实现小型区块链功能
Apr 03 Javascript
ES6知识点整理之模块化的应用详解
Apr 15 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 IPV6正则表达式验证代码
2010/02/16 PHP
session在PHP大型web应用中的使用
2011/06/25 PHP
学习使用curl采集curl使用方法
2012/01/11 PHP
php ci 获取表单中多个同名input元素值的代码
2016/03/25 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
2019/10/22 PHP
jQuery 技巧小结
2010/04/02 Javascript
基于jQuery的message插件实现右下角弹出消息框
2011/01/11 Javascript
jQuery div层的放大与缩小简单实现代码
2013/03/28 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
NodeJS学习笔记之Connect中间件模块(二)
2015/01/27 NodeJs
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
详解JS数据类型的值拷贝函数(深拷贝)
2017/07/13 Javascript
对vue中v-on绑定自定事件的实例讲解
2018/09/06 Javascript
php结合js实现多条件组合查询
2019/05/28 Javascript
微信小程序开发搜索功能实现(前端+后端+数据库)
2020/03/04 Javascript
JS实现鼠标移动拖尾
2020/12/27 Javascript
编写同时兼容Python2.x与Python3.x版本的代码的几个示例
2015/03/30 Python
使用httplib模块来制作Python下HTTP客户端的方法
2015/06/19 Python
Python3爬虫全国地址信息
2019/01/05 Python
python爬虫豆瓣网的模拟登录实现
2019/08/21 Python
Python将字典转换为XML的方法
2020/08/01 Python
Python自动化之UnitTest框架实战记录
2020/09/08 Python
法国综合购物网站:RueDuCommerce
2016/09/12 全球购物
Herschel Supply Co.美国:背包、手提袋及配件
2020/11/24 全球购物
Exception类的常用方法
2012/06/16 面试题
基层工作经历证明
2014/01/13 职场文书
房地产财务管理制度
2014/02/02 职场文书
学习十八大报告感言
2014/02/04 职场文书
大学学雷锋活动总结
2014/06/26 职场文书
庆祝三八妇女节标语
2014/10/09 职场文书
小浪底导游词
2015/02/12 职场文书
幼儿园教师师德承诺书
2015/04/28 职场文书
Python scrapy爬取起点中文网小说榜单
2021/06/13 Python
MySQL令人大跌眼镜的隐式转换
2021/08/23 MySQL
win10以太网连接不上怎么办?Win10连接以太网详细教程
2022/04/08 数码科技