JS实现异步上传压缩图片


Posted in Javascript onApril 22, 2017

摘要: 使用iframe来处理异步上传图片,在现在这个时代来说,多多少少都有点落后了!单单就凭AJAX和JS就不能做到异步上传图片了吗?

感谢 think2011 这位兄台的JS库:https://github.com/think2011/LocalResizeIMG

先看调用页面:

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0,user-scalable=no">
    <script type="text/javascript" src="./js/lrz.mobile.min.js"></script>
    <script src="http://libs.baidu.com/jquery/1.9.0/jquery.js"></script>
</head>
<body class="upload">
<form id="form">
    <div id="img_show"></div>
    <div id="upload">
      <div id="img_file"><input type="file" accept="image/*" ><div class="btn">选择图片</div></div>
    </div>
    <input type="submit" class="tijiao" value="提交">
  </form>
</body>

<script type="text/javascript">
  var img;
  $("input:file").change(function (){
    //console.log(this.files[0]);
    lrz(this.files[0],{width:640,quality:0.9},function(rst){
      img = rst.base64;
      var html = [];
      var show_img = new Image();
      show_img.src = rst.base64;
      $("#img_show").html("<div class='upimg'></div>");
      $(".upimg").html(show_img);
    });
  });
  $("#form").submit(function (){
    var phone = $("input[name='phone']").val();
    var month = $("input[name='month']").val();
    $.post("upload.php",{img:img,phone:phone,month:month},function(data){
      img = null;
      alert(data.msg);
    },'json');
    return false;
  });
</script>
</html>

1.首先你要载入JS类库:

<script type="text/javascript" src="./js/lrz.mobile.min.js"></script>

2.然后就是写好form

3.准备处理图片以及图片异步提交的JS。

<script type="text/javascript">
  var img;
  $("input:file").change(function (){
    //console.log(this.files[0]);
    lrz(this.files[0],{width:640,quality:0.9},function(rst){
      img = rst.base64;
      var html = [];
      var show_img = new Image();
      show_img.src = rst.base64;
      $("#img_show").html("<div class='upimg'></div>");
      $(".upimg").html(show_img);
    });
  });
  $("#form").submit(function (){
    var phone = $("input[name='phone']").val();
    var month = $("input[name='month']").val();
    $.post("upload.php",{img:img},function(data){
      img = null;
      alert(data.msg);
    },'json');
    return false;
  });
</script>

从代码中可以看出,这个JS库是把图片转成码,然后用变量存起来,然后在用异步POST到服务器中在处理。

看起来貌似没有什么特别的地方,的确实在也没有什么特别的地方.......

后台处理程序PHP:

function error($msg=''){
  $return = array('msg'=>$msg);
  echo json_encode($return);
  exit();
}

function main(){
  if(!$_POST['img']){
    error('请上传图片!');
  }
  
  $img = $_POST['img'];
  
  $path = './upload/';
  
  $type_limit = array('jpg','jpeg','png');

  if(preg_match('/data:\s*image\/(\w+);base64,/iu',$img,$tmp)){
    if(!in_array($tmp[1],$type_limit)){
      error('图片格式不正确,只支持jpg,jpeg,png!');
    }
  }else{
    error('抱歉!上传失败,请重新再试!');
  }
  
  $img = str_replace(' ','+',$img);
  
  $img = str_replace($tmp[0], '', $img);

  $img = base64_decode($img);
  
  $file = $path.time().'.'.$tmp[1];
  if(!file_put_contents($file,$img)){
    error('上传图片失败!');
  }else{
    error('恭喜您!上传成功!');
  }
}
main();

上述代码如果有错误欢迎指出。

如上诉代码,正如你看到的那样,经过BASE64加密过的图片码经过JS异步的POST过来后端后,我们要把代码还原。但是JS库加密的时候会带有一些标签,所以还原前需要处理掉这些本来不属于图片的东西。

$img = str_replace(' ','+',$img);  
$img = str_replace($tmp[0], '', $img);
$img = base64_decode($img);

最后把代码塞进文件,设置好相应的文件名和扩展名,图片就成功上传到了服务器了。

注意:

前后端包括JS编码要要一致,建议UTF-8

如果图片还原不会来的话,那肯定是数据问题,打印POST过来的图片码出来看看。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery实现渐变弹出层和弹出菜单的方法
Feb 20 Javascript
js实现跨域的方法实例详解
Jun 24 Javascript
jquery实现带渐变淡入淡出并向右依次展开的多级菜单效果实例
Aug 22 Javascript
js随机生成字母数字组合的字符串 随机动画数字
Sep 02 Javascript
JavaScript缓冲运动实现方法(2则示例)
Jan 08 Javascript
js 能实现监听F5页面刷新子iframe 而父页面不刷新的方法
Nov 09 Javascript
微信小程序自定义底部导航带跳转功能
Nov 27 Javascript
vuex 解决报错this.$store.commit is not a function的方法
Dec 17 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
Apr 19 Javascript
在React中写一个Animation组件为组件进入和离开加上动画/过度效果
Jun 24 Javascript
百度小程序自定义通用toast组件
Jul 17 Javascript
JS求解两数之和算法详解
Apr 28 Javascript
vue 和vue-touch 实现移动端左右导航效果(仿京东移动站导航)
Apr 22 #Javascript
Vue form 表单提交+ajax异步请求+分页效果
Apr 22 #Javascript
详解Vue 事件驱动和依赖追踪
Apr 22 #Javascript
JS使用cookie实现只出现一次的广告代码效果
Apr 22 #Javascript
利用JS实现简单的瀑布流加载图片效果
Apr 22 #Javascript
jQuery实现百度登录框的动态切换效果
Apr 21 #jQuery
HTML5+Canvas调用手机拍照功能实现图片上传(下)
Apr 21 #Javascript
You might like
967 个函式
2006/10/09 PHP
PHP高自定义性安全验证码代码
2011/11/27 PHP
如何用PHP实现插入排序?
2013/04/10 PHP
Zend Framework实现多服务器共享SESSION数据的方法
2016/03/22 PHP
PHP常见错误提示含义解释(实用!值得收藏)
2016/04/25 PHP
JS中数组Array的用法示例介绍
2014/02/20 Javascript
jquery实现显示已选用户
2014/07/21 Javascript
jQuery的css()方法用法实例
2014/12/24 Javascript
jQuery对象的length属性用法实例
2014/12/27 Javascript
jQuery使用之标记元素属性用法实例
2015/01/19 Javascript
JavaScript中神奇的call()方法
2015/03/12 Javascript
详解JS面向对象编程
2016/01/24 Javascript
使用ionic切换页面卡顿的解决方法
2016/12/16 Javascript
SVG动画vivus.js库使用小结(实例代码)
2017/09/14 Javascript
JavaScript模拟实现封装的三种方式及写法区别
2017/10/27 Javascript
JS实现的邮箱提示补全效果示例
2018/01/30 Javascript
微信小程序登录对接Django后端实现JWT方式验证登录详解
2019/07/29 Javascript
layui实现form表单同时提交数据和文件的代码
2019/10/25 Javascript
Python SQLAlchemy基本操作和常用技巧(包含大量实例,非常好)
2014/05/06 Python
Python打包可执行文件的方法详解
2016/09/19 Python
python查看模块,对象的函数方法
2018/10/16 Python
Python底层封装实现方法详解
2020/01/22 Python
python3正则模块re的使用方法详解
2020/02/11 Python
解决Python中报错TypeError: must be str, not bytes问题
2020/04/07 Python
如何在scrapy中捕获并处理各种异常
2020/09/28 Python
美国第一大药店连锁机构:Walgreens(沃尔格林)
2019/10/10 全球购物
Ray-Ban雷朋奥地利官网:全球领先的太阳眼镜品牌
2020/10/12 全球购物
销售工作人员的自我评价分享
2013/11/10 职场文书
《小熊住山洞》教学反思
2014/02/21 职场文书
求职意向书
2014/04/01 职场文书
高中生评语大全
2014/04/25 职场文书
纺织工程专业推荐信
2014/09/08 职场文书
销售员岗位职责
2015/02/10 职场文书
通知范文怎么写
2015/04/16 职场文书
争做文明公民倡议书
2019/06/24 职场文书
导游词之山东红叶谷
2019/10/31 职场文书