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 相关文章推荐
Javascript与vbscript数据共享
Jan 09 Javascript
javascript attachEvent和addEventListener使用方法
Mar 19 Javascript
基于jquery的仿百度的鼠标移入图片抖动效果
Sep 17 Javascript
jQuery EasyUI API 中文文档 - Draggable 可拖拽
Sep 29 Javascript
js判断背景图片是否加载成功使用img的width实现
May 29 Javascript
cookie 最近浏览记录(中文escape转码)具体实现
Jun 08 Javascript
jQuery实现横向带缓冲的水平运动效果(附demo源码下载)
Jan 29 Javascript
js 中获取制定的cook信息实现方法
Nov 19 Javascript
JS实现弹出下载对话框及常见文件类型的下载
Jul 13 Javascript
vue2中使用less简易教程
Mar 27 Javascript
vue的hash值原理也是table切换实例代码
Dec 14 Vue.js
js实现模拟购物商城案例
May 18 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
PHP的面试题集
2006/11/19 PHP
php使用正则过滤js脚本代码实例
2014/05/10 PHP
PHP无限极分类函数的实现方法详解
2017/04/15 PHP
js中的window.open返回object的错误的解决方法
2009/08/15 Javascript
jquery checkbox,radio是否选中的判断代码
2010/03/20 Javascript
JS完成代码前最好对其做5件事
2013/04/07 Javascript
js使浏览器窗口最大化实现代码(适用于IE)
2013/08/07 Javascript
jquery序列化方法实例分析
2015/06/10 Javascript
jQuery实现ctrl+enter(回车)提交表单
2015/10/19 Javascript
详解从新建vue项目到引入组件Element的方法
2017/08/29 Javascript
js实现数组和对象的深浅拷贝
2017/09/30 Javascript
Nuxt升级2.0.0时出现的问题(小结)
2018/10/08 Javascript
bootstrap table插件动态加载表头
2019/07/19 Javascript
Vue Elenent实现表格相同数据列合并
2020/11/30 Vue.js
python实现在目录中查找指定文件的方法
2014/11/11 Python
Python pass详细介绍及实例代码
2016/11/24 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
对pandas进行数据预处理的实例讲解
2018/04/20 Python
Pyinstaller打包.py生成.exe的方法和报错总结
2019/04/02 Python
解决Python正则表达式匹配反斜杠''\''问题
2019/07/17 Python
基于Python获取城市近7天天气预报
2019/11/26 Python
浅谈tensorflow 中的图片读取和裁剪方式
2020/06/30 Python
Python Map 函数的使用
2020/08/28 Python
利用Python实现朋友圈中的九宫格图片效果
2020/09/03 Python
用CSS3和table标签实现一个圆形轨迹的动画的示例代码
2019/01/17 HTML / CSS
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
编程输出如下图形
2013/11/24 面试题
《植物妈妈有办法》教学反思
2014/02/25 职场文书
十佳护士先进事迹
2014/05/08 职场文书
学校运动会霸气口号
2014/06/07 职场文书
运动员获奖感言
2014/08/15 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
班主任经验交流材料
2014/12/16 职场文书
音乐研修感悟
2015/11/18 职场文书
公务员廉洁从政心得体会
2016/01/19 职场文书
如何Tomcat中使用ipv6地址
2022/05/06 Servers