推荐三款不错的图片压缩上传插件(webuploader、localResizeIMG4、LUploader)


Posted in Javascript onApril 21, 2017

涉及到网页图片的交互,少不了图片的压缩上传,相关的插件有很多,相信大家都有用过,这里我就推荐三款,至于好处就仁者见仁喽:

1.名气最高的WebUploader,由Baidu FEX 团队开发,以H5为主,FLASH为辅,兼容 IE6+,iOS 6+, android 4+,采用大文件分片并发上传,极大的提高了文件上传效率,看了官方文档就知道,能满足你所需要的所有功能,一言以蔽之,大而全;至于缺点,大概就是插件体积太大了,自带样式文件,而且还要依赖jquery类库。详细的教程网上俯拾即是,这里我就附上一段简单的demo:

<!Doctype html>
<html lang='en'>
<head>
 <meta charset='utf-8'/>
 <meta name='viewport' content='width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no'/>
 <title>实验</title>
 <style>
  *{
   margin:0;
   padding:0;
  }
  .progress{
   height:50px;
   background-color: red;
  }
 </style>
 <link rel="stylesheet" href="assets/webuploader.css" rel="external nofollow" >
</head>
<body>

 <div class="myuploader">
  <!--用来存放文件信息-->
  <div class="uploader-list">
  </div>
  <!-- 放置按钮 -->
  <div class="btns">
   <div id="picker">选择文件</div>
   <!-- <button class="send">开始上传</button> -->
  </div>
 </div>
 <img src="" alt="" />
 <div class="state"></div>
 <div class="progess"></div>
 
 <script src="assets/jquery-1.12.0.js"></script>
 <script src="assets/webuploader.html5only.min.js"></script>
 <script> 
  // 初始化WebUploader 
  var uploader = WebUploader.create({
   // 选完文件后是否自动上传
   auto:true,   

   // 文件接收的服务端路径
   server:'http://webuploader.duapp.com/server/fileupload.php',

   // 选择文件的按钮
   pick:'#picker',

   // 只允许选择图片文件
   accept: {
    title: 'Images',
    extensions: 'gif,jpg,jpeg,bmp,png',
    mimeTypes: 'image/jpg,image/jpeg,image/png' //如果写成image/*会出现响应慢的问题
   },  

   // 配置生成缩略图的选项
   thumb:{
    // 缩略图的宽高,当取值介于0-1时,被当成百分比使用
    width:500,
    height:250,
    // 强制转换成指定的类型
    type:"image/jpeg",
    // 图片质量,只有type为image/jpeg的时候才有效
    quality:70,
    // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false
    allowMagnify:true,
    // 是否允许裁剪
    crop:true   
   },  

   // 是否压缩图片, 默认如果是jpeg文件上传前会压缩,如果是false, 则图片在上传前不进行压缩
   compress:{
    // 压缩后的尺寸
    width: 100,
    height: 100,
    // 图片质量,只有type为image/jpeg的时候才有效。
    quality: 90,
    // 是否允许放大,如果想要生成小图的时候不失真,此选项应该设置为false
    allowMagnify: false,
    // 是否允许裁剪
    crop: false,
    // 是否保留头部meta信息
    preserveHeaders: true,
    // 如果发现压缩后文件大小比原来还大,则使用原来图片,此属性可能会影响图片自动纠正功能
    noCompressIfLarger: false,
    // 单位字节,如果图片大小小于此值,不会采用压缩
    compressSize: 0
   }
  });
  // 监听fileQueued事件来处理UI逻辑,当有一批文件被添加进队列改用filesQueued
  uploader.on('fileQueued', function( file ) {
   // 可以在控制台中查看file对象的详细信息
   console.log(file);
   // 创建缩略图 makeThumb,还可以写成(file,callback,width,height)
   uploader.makeThumb(file,function(error,src) {
    if (error) {
     console.log("不能预览");
     return;
    }else{
     $("img").attr('src',src); 
    }
   });    
  });   
  // 文件上传开始
  uploader.on('startUpload', function(file) {
   $(".state").text('开始');
  });  
  // 文件上传进度
  uploader.on('uploadProgress', function(file,percentage) {
   $(".progress").css('width', percentage * 100 + "%" );
  });    
  // 文件上传成功
  uploader.on('uploadSuccess', function(file) {
   console.log("成功");
   $(".state").text('已上传');
  });
  // 文件上传失败
  uploader.on('uploadError', function(file) {
   console.log("失败");
   $(".state").text('上传出错');
   // 获取文件统计信息
   console.log(uploader.getStats());
   //
   console.log(uploader.getFiles('error'));
  });
  // 文件上传完成
  uploader.on('uploadComplete', function(file) {
   console.log("完成");
   $(".progress").fadeOut();
  });    
 </script>
</body>
</html>

2.移动端的插件,如果能脱离jquery,并且能满足项目的基本需求就再好不过了,这里像localResizeIMG就做得不错,它有4个历史版本,建议引入最新稳定版本localResizeIMG4,demo如下(样式要自己写):

<!Doctype html>
<html lang='en'>
<head>
 <meta charset='utf-8'/>
 <meta name='viewport' content='width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no'/>
 <title>实验</title>
 <style>
  *{
   margin:0;
   padding:0;
  }
 </style>
</head>
<body>
 <!-- capture="camera"可以出现拍照;accept="image/*"仅接受图片 -->
 <input type="file" id="file" name="logo" capture="camera" >

 <!-- 一般情况下引入lrz.bundle.js,但绝对不要删除目录下的*.chunk.js,这些文件分别对应了IOS和Android的兼容代码,检测到符合环境时会自动引入,lrz.all.bundle.js是包含了所有引用了,莫名其妙的问题下就引用这个吧 -->
 <script src="assets/lrz.bundle.js"></script>
 <script> 
  // 通过change事件可以得到用户选择的图片
  document.querySelector("input").addEventListener("change",function(){
   // this.files[0]就是用户选择的文件,当做参数传入lrz(file, [options]),或者直接传入图片路径
   // [options]中的width表示图片最大不超过的宽度,默认为原图宽度,height不设时会适应宽度;quality表示图片压缩质量,取值 0 - 1,默认为0.7;fieldName表示后端接收的字段名,默认为 file
   lrz(this.files[0], {width: 1024})
   // 上述返回值是一个promise对象,后面可以接then(rst) catch(err) always()
   .then(function(rst){
    // 通过图片的预加载来实现图片预览
    var img = new Image();// 创建一个Image对象
    // 先绑定onload事件,然后再给src赋值,原因好像是为了解决ie,opera下的兼容问题 
    // 图片加载完毕时异步调用
    img.onload = function () {
     console.log("图片加载完毕")
     img.onload = null; // 解决内存泄漏,同时避免动态图片的事件多次触发 
     document.body.appendChild(img);
    };     
    img.src = rst.base64;// 载入生成后的图片base64
    // 返回rst便于链式调用
    return rst; 
   })
   .then(function(rst){
    // 除了以上的内容,rst.formData表示后端可处理的数据;rst.file表示压缩后的对象;rst.fileLen表示生成后的图片大小;rst.base64Len表示生成后的base的大小;rst.origin表示原始的对象,包括大小,日期等信息    
    console.log(rst.formData)
    //可以在这里写ajax的上传代码,原生和jquery的都可以
    // 返回rst便于链式调用
    return rst;     
   })
   .catch(function(err){
    // 万一出错了,这里可以捕捉到错误信息,而且以上的then都不会执行
    alert(err);
   })
   .always(function(){
    // 不管是成功失败,这里都会执行
    console.log("执行完成")
   })
  })
 </script>
</body>
</html>

3.以上两款优缺点一目了然,本人公司用的是LUploader,纯原生js写的,不依赖任何类库,压缩后的js文件只有5k,实现图片压缩上传只需三步:

(1)在html页面中引入input标签,通过自定义属性data-LUploader绑定点击触发的标签id:

<div class="LUploader" id="demo1">
  <div class="LUploader-container">
   <input data-LUploader='demo1' data-form-file='basestr' data-upload-type='front' type="file" />
   <ul class="LUploader-list"></ul>
  </div>
  <div>
   <div class="icon"></div>
   <p>单击上传</p>
  </div>
</div>

(2)将样式文件和js文件引入到页面中:

<link rel="stylesheet" href="css/LUploader.css" rel="external nofollow" >
<script src="js/LUploader.js"></script>

(3)js脚本中初始化插件:

new LUploader(这里放需要绑定的input对象作为参数, {
   url: '',//post请求地址
   multiple: false,//是否一次上传多个文件 默认false
   maxsize: 102400,//忽略压缩操作的文件体积上限 默认100kb
   accept: 'image/jpg,image/jpeg,image/png',//如果写成image/*会出现响应慢的问题
   quality: 0.1,//压缩比 默认0.1 范围0.1-1.0 越小压缩率越大
   showsize:false//是否显示原始文件大小 默认false
});

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

Javascript 相关文章推荐
用javascript获取textarea中的光标位置
May 06 Javascript
js模拟弹出效果代码修正版
Aug 07 Javascript
js 变量类型转换常用函数与代码[比较全]
Dec 01 Javascript
IE6下focus与blur错乱的解决方案
Jul 31 Javascript
JavaScript中DOM详解
Apr 13 Javascript
JavaScript仿支付宝密码输入框
Dec 29 Javascript
浅谈javascript中的加减时间
Jul 12 Javascript
纯原生js实现table表格的增删
Jan 05 Javascript
Vue响应式原理详解
Apr 18 Javascript
JS中DOM元素的attribute与property属性示例详解
Sep 04 Javascript
微信小程序控制台提示warning:Now you can provide attr &quot;wx:key&quot; for a &quot;wx:for&quot; to improve performance解决方法
Feb 21 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
Jun 24 Javascript
H5图片压缩与上传实例
Apr 21 #Javascript
H5手机端多文件上传预览插件
Apr 21 #Javascript
ES6新特性八:async函数用法实例详解
Apr 21 #Javascript
.net MVC+Bootstrap下使用localResizeIMG上传图片
Apr 21 #Javascript
jquery中$.fn和图片滚动效果实现的必备知识总结
Apr 21 #jQuery
ES6新特性七:数组的扩充详解
Apr 21 #Javascript
React中ES5与ES6写法的区别总结
Apr 21 #Javascript
You might like
PHP 配置open_basedir 让各虚拟站点独立运行
2009/11/12 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
2014/07/15 PHP
PHP获取远程图片并保存到本地的方法
2015/05/12 PHP
Javascript----文件操作
2007/01/18 Javascript
任意位置显示html菜单
2007/02/01 Javascript
使用Grunt.js管理你项目的应用说明
2013/04/24 Javascript
jquery 定位input元素的几种方法小结
2013/07/28 Javascript
Vue.js基础知识汇总
2016/04/27 Javascript
JavaScript面试题(指针、帽子和女朋友)
2016/11/23 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
使用bootstraptable插件实现表格记录的查询、分页、排序操作
2017/08/06 Javascript
深入浅析Vue中的slots/scoped slots
2018/04/03 Javascript
React Router v4 入坑指南(小结)
2018/04/08 Javascript
JavaScript数组,JSON对象实现动态添加、修改、删除功能示例
2018/05/26 Javascript
JavaScript实现星级评价效果
2019/05/17 Javascript
JS实现选项卡效果的代码实例
2019/05/20 Javascript
详解JavaScript 浮点数运算的精度问题
2019/07/23 Javascript
nuxt框架中对vuex进行模块化设置的实现方法
2019/09/06 Javascript
element-ui table行点击获取行索引(index)并利用索引更换行顺序
2020/02/27 Javascript
JS实现滑动拼图验证功能完整示例
2020/03/29 Javascript
jQuery实现B2B网站后台管理系统侧导航
2020/07/08 jQuery
python实现多人聊天室
2020/03/31 Python
django项目简单调取百度翻译接口的方法
2019/08/06 Python
Pandas中DataFrame交换列顺序的方法实现
2020/12/14 Python
美国汽车性能部件和赛车零件网站:Vivid Racing
2018/03/27 全球购物
采购部部长岗位职责
2014/02/06 职场文书
yy婚礼主持词
2014/03/14 职场文书
讲党性心得体会
2014/09/03 职场文书
教师求职自荐信范文
2015/03/04 职场文书
2016年国培研修日志
2015/11/13 职场文书
文艺委员竞选稿
2015/11/19 职场文书
曾国藩励志经典名言37句,蕴含哲理
2019/10/14 职场文书
Python基础详解之描述符
2021/04/28 Python
MySQL读取JSON转换的方式
2022/03/18 MySQL
SQL中去除重复数据的几种方法汇总(窗口函数对数据去重)
2023/05/08 MySQL