快速掌握jQuery插件WebUploader文件上传


Posted in Javascript onNovember 07, 2016

文件上传是网站和 Web 应用程序的常用功能,一直没有一款完美的文件上传组件,因此让很多开发人员碰到头疼的浏览器兼容问题。

WebUploader 是由 Baidu FEX 团队开发的一款以 HTML5 为主,FLASH 为辅的现代文件上传组件。在现代的浏览器里面能充分发挥 HTML5 的优势,同时又不摒弃主流IE浏览器,沿用原来的 FLASH 运行时,兼容 IE6+,iOS 6+, android 4+。采用大文件分片并发上传,极大的提高了文件上传效率。

参考百度官网进行学习借鉴,整理,具体内容如下

先来说一说WebUploader的特性

分片、并发

分片与并发结合,将一个大文件分割成多块,并发上传,极大地提高大文件的上传速度。

当网络问题导致传输错误时,只需要重传出错分片,而不是整个文件。另外分片传输能够更加实时的跟踪上传进度。

具体就可以查看:jQuery webuploader分片上传大文件

预览、压缩

支持常用图片格式jpg,jpeg,gif,bmp,png预览与压缩,节省网络数据传输。

解析jpeg中的meta信息,对于各种orientation做了正确的处理,同时压缩后上传保留图片的所有原始meta数据。

多途径添加文件

支持文件多选,类型过滤,拖拽(文件&文件夹),图片粘贴功能。

粘贴功能主要体现在当有图片数据在剪切板中时(截屏工具如QQ(Ctrl + ALT + A), 网页中右击图片点击复制),Ctrl + V便可添加此图片文件。

HTML5 & FLASH

兼容主流浏览器,接口一致,实现了两套运行时支持,用户无需关心内部用了什么内核。

同时Flash部分没有做任何UI相关的工作,方便不关心flash的用户扩展和自定义业务需求。

MD5秒传

当文件体积大、量比较多时,支持上传前做文件md5值验证,一致则可直接跳过。

如果服务端与前端统一修改算法,取段md5,可大大提升验证性能,耗时在20ms左右。

易扩展、可拆分

采用可拆分机制, 将各个功能独立成了小组件,可自由搭配。

采用AMD规范组织代码,清晰明了,方便高级玩家扩展。

只有知道了WebUploader文件上传插件的特性,才能更充分的发挥其作用。

如何使用?

引入资源
使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF。

<!--引入CSS-->
<link rel="stylesheet" type="text/css" href="webuploader文件夹/webuploader.css">

<!--引入JS-->
<script type="text/javascript" src="webuploader文件夹/webuploader.js"></script>

<!--SWF在初始化的时候指定,在后面将展示-->

1、文件上传

WebUploader只包含文件上传的底层实现,不包括UI部分,所以交互方面可以自由发挥。

Html部分

首先准备dom结构,包含存放文件信息的容器、选择按钮和上传按钮三个部分。

<div id="uploader" class="wu-example">
 <!--用来存放文件信息-->
 <div id="thelist" class="uploader-list"></div>
 <div class="btns">
 <div id="picker">选择文件</div>
 <button id="ctlBtn" class="btn btn-default">开始上传</button>
 </div>
</div>

初始化Web Uploader

具体说明,请看一下代码中的注释部分。

var uploader = WebUploader.create({

 // swf文件路径
 swf: BASE_URL + '/js/Uploader.swf',

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

 // 选择文件的按钮。可选。
 // 内部根据当前运行是创建,可能是input元素,也可能是flash.
 pick: '#picker',

 // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
 resize: false
});

显示用户选择
由于webuploader不处理UI逻辑,所以需要去监听fileQueued事件来实现。

// 当有文件被添加进队列的时候
uploader.on( 'fileQueued', function( file ) {
 $list.append( '<div id="' + file.id + '" class="item">' +
 '<h4 class="info">' + file.name + '</h4>' +
 '<p class="state">等待上传...</p>' +
 '</div>' );
});

文件上传进度

文件上传中,Web Uploader会对外派送uploadProgress事件,其中包含文件对象和该文件当前上传进度。

// 文件上传过程中创建进度条实时显示。
uploader.on( 'uploadProgress', function( file, percentage ) {
 var $li = $( '#'+file.id ),
 $percent = $li.find('.progress .progress-bar');

 // 避免重复创建
 if ( !$percent.length ) {
 $percent = $('<div class="progress progress-striped active">' +
 '<div class="progress-bar" role="progressbar" style="width: 0%">' +
 '</div>' +
 '</div>').appendTo( $li ).find('.progress-bar');
 }

 $li.find('p.state').text('上传中');

 $percent.css( 'width', percentage * 100 + '%' );
});

文件成功、失败处理

文件上传失败会派送uploadError事件,成功则派送uploadSuccess事件。不管成功或者失败,在文件上传完后都会触发uploadComplete事件。

uploader.on( 'uploadSuccess', function( file ) {
 $( '#'+file.id ).find('p.state').text('已上传');
});

uploader.on( 'uploadError', function( file ) {
 $( '#'+file.id ).find('p.state').text('上传出错');
});

uploader.on( 'uploadComplete', function( file ) {
 $( '#'+file.id ).find('.progress').fadeOut();
});

2、图片上传

Html:

要实现如上demo,首先需要准备一个按钮,和一个用来存放添加的文件信息列表的容器。

<!--dom结构部分-->
<div id="uploader-demo">
 <!--用来存放item-->
 <div id="fileList" class="uploader-list"></div>
 <div id="filePicker">选择图片</div>
</div>

Javascript:

创建Web Uploader实例

// 初始化Web Uploader
var uploader = WebUploader.create({

 // 选完文件后,是否自动上传。
 auto: true,

 // swf文件路径
 swf: BASE_URL + '/js/Uploader.swf',

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

 // 选择文件的按钮。可选。
 // 内部根据当前运行是创建,可能是input元素,也可能是flash.
 pick: '#filePicker',

 // 只允许选择图片文件。
 accept: {
 title: 'Images',
 extensions: 'gif,jpg,jpeg,bmp,png',
 mimeTypes: 'image/*'
 }
});

监听fileQueued事件,通过uploader.makeThumb来创建图片预览图。
PS: 这里得到的是Data URL数据,IE6、IE7不支持直接预览。可以借助FLASH或者服务端来完成预览。

// 当有文件添加进来的时候
uploader.on( 'fileQueued', function( file ) {
 var $li = $(
 '<div id="' + file.id + '" class="file-item thumbnail">' +
 '<img>' +
 '<div class="info">' + file.name + '</div>' +
 '</div>'
 ),
 $img = $li.find('img');


 // $list为容器jQuery实例
 $list.append( $li );

 // 创建缩略图
 // 如果为非图片文件,可以不用调用此方法。
 // thumbnailWidth x thumbnailHeight 为 100 x 100
 uploader.makeThumb( file, function( error, src ) {
 if ( error ) {
 $img.replaceWith('<span>不能预览</span>');
 return;
 }

 $img.attr( 'src', src );
 }, thumbnailWidth, thumbnailHeight );
});

然后剩下的就是上传状态提示了,当文件上传过程中, 上传成功,上传失败,上传完成都分别对应uploadProgress, uploadSuccess, uploadError, uploadComplete事件。

// 文件上传过程中创建进度条实时显示。
uploader.on( 'uploadProgress', function( file, percentage ) {
 var $li = $( '#'+file.id ),
 $percent = $li.find('.progress span');

 // 避免重复创建
 if ( !$percent.length ) {
 $percent = $('<p class="progress"><span></span></p>')
 .appendTo( $li )
 .find('span');
 }

 $percent.css( 'width', percentage * 100 + '%' );
});

// 文件上传成功,给item添加成功class, 用样式标记上传成功。
uploader.on( 'uploadSuccess', function( file ) {
 $( '#'+file.id ).addClass('upload-state-done');
});

// 文件上传失败,显示上传出错。
uploader.on( 'uploadError', function( file ) {
 var $li = $( '#'+file.id ),
 $error = $li.find('div.error');

 // 避免重复创建
 if ( !$error.length ) {
 $error = $('<div class="error"></div>').appendTo( $li );
 }

 $error.text('上传失败');
});

小案例:webuploader使用java如何实现上传?

Html代码 

<div id="uploader" class="wu-example"> 
  <div class="queueList"> 
   <div id="dndArea" class="placeholder"> 
   <div id="filePicker"></div> 
   <p>或将照片拖到这里,单次最多可选300张</p> 
   </div> 
  </div> 
  <div class="statusBar" style="display: none;"> 
   <div class="progress"> 
   <span class="text">0%</span> <span class="percentage"></span> 
   </div> 
   <div class="info"></div> 
   <div class="btns"> 
   <div id="filePicker2"></div> 
   <div class="uploadBtn">开始上传</div> 
   </div> 
  </div> 
  </div> 
 
<!-- webuploader --> 
<link rel="stylesheet" type="text/css" 
 href="/static/js/webuploader/css.css"> 
<link rel="stylesheet" type="text/css" 
 href="/static/js/webuploader/image.css"> 
<script type="text/javascript" src="/static/js/webuploader/min.js"></script> 
<script type="text/javascript" 
 src="/static/js/webuploader/upload-image.js"></script>

js代码 

// 实例化 
 uploader = WebUploader.create({ 
 pick: { 
 id: '#filePicker', 
 label: '点击选择图片' 
 }, 
 dnd: '#uploader .queueList', 
 paste: document.body, 
 accept: { 
 title: 'Images', 
 extensions: 'gif,jpg,jpeg,bmp,png', 
 mimeTypes: 'image/*' 
 }, 
 // swf文件路径 
 [color=red]swf: '/static/js/webuploader/Uploader.swf',[/color] 
 disableGlobalDnd: true, 
 chunked: true, 
 server: '/point/image/bulk.html', 
 fileNumLimit: 300, 
 fileSizeLimit: 50*1024*1024,//5M 
 fileSingleSizeLimit: 5*1024*1024 //1M 
 });

上传文件和普通的spring一样

Java代码 

@RequestMapping("/bulk") 
@ResponseBody 
public String bulk(HttpServletRequest request, MultipartFile file) { 
 String path = super.uploadFile(request, "file", true); 
 return "1"; 
}

引用

Spring MVC3.2开始支持通过Servlet3.0实现文件上传

Xml代码 

<bean id="multipartResolver"class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></bean> 

更多精彩内容,请点击《jQuery上传操作汇总》,进行深入学习和研究。

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

Javascript 相关文章推荐
js里的prototype使用示例
Nov 19 Javascript
js实现图片轮换效果代码
Apr 16 Javascript
jQuery实现的输入框选择时间插件用法实例
Feb 28 Javascript
Jquery uploadify上传插件使用详解
Jan 13 Javascript
使用contextMenu插件实现Bootstrap table弹出右键菜单
Feb 20 Javascript
微信小程序 图片加载(本地,网路)实例详解
Mar 10 Javascript
微信小程序返回多级页面的实现方法
Oct 27 Javascript
fetch 如何实现请求数据
Dec 20 Javascript
重学JS之显示强制类型转换详解
Jun 30 Javascript
async/await让异步操作同步执行的方法详解
Nov 01 Javascript
javascript实现点击星星小游戏
Dec 24 Javascript
JS前端面试必备——基本排序算法原理与实现方法详解【插入/选择/归并/冒泡/快速排序】
Feb 24 Javascript
jquery.validate表单验证插件使用方法解析
Nov 07 #Javascript
功能强大的jquery.validate表单验证插件
Nov 07 #Javascript
JS 实现Base64编码与解码实例详解
Nov 07 #Javascript
百度多文件异步上传控件webuploader基本用法解析
Nov 07 #Javascript
Angularjs的Controller间通信机制实例分析
Nov 07 #Javascript
jquery组件WebUploader文件上传用法详解
Oct 23 #Javascript
Vue.js 和 MVVM 的注意事项
Nov 07 #Javascript
You might like
PHP运行出现Notice : Use of undefined constant 的完美解决方案分享
2012/03/05 PHP
PHP中extract()函数的定义和用法
2012/08/17 PHP
PHP连接MySQL的2种方法小结以及防止乱码
2014/03/11 PHP
PHP动态生成指定大小随机图片的方法
2016/03/25 PHP
php 广告点击统计代码(php+mysql)
2018/02/21 PHP
PHP 文件上传限制问题
2019/09/01 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
jquery 表单进行客户端验证demo
2009/08/24 Javascript
仿猪八戒网左下角的文字滚动效果
2011/10/28 Javascript
js实现页面转发功能示例代码
2013/08/05 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
微信小程序商品到详情的实现
2017/06/27 Javascript
一篇文章让你彻底弄懂JS的事件冒泡和事件捕获
2017/08/14 Javascript
vue使用中的内存泄漏【推荐】
2018/07/10 Javascript
NodeJS实现同步的方法
2019/03/02 NodeJs
jquery更改元素属性attr()方法操作示例
2020/05/22 jQuery
vue-router的hooks用法详解
2020/06/08 Javascript
vue中echarts的用法及与elementui-select的协同绑定操作
2020/11/17 Vue.js
Python使用matplotlib实现绘制自定义图形功能示例
2018/01/18 Python
详解用TensorFlow实现逻辑回归算法
2018/05/02 Python
wxPython+Matplotlib绘制折线图表
2019/11/19 Python
用python获取txt文件中关键字的数量
2020/12/24 Python
英国最大的在线蜡烛商店:Candles Direct
2019/03/26 全球购物
意大利男装网店:Vrients
2019/05/02 全球购物
中海讯通笔试题
2015/09/15 面试题
在对linux系统分区进行格式化时需要对磁盘簇(或i节点密度)的大小进行选择,请说明选择的原则
2012/01/13 面试题
会计电算化专业个人的自我评价
2013/11/24 职场文书
成考报名单位证明范本
2014/01/16 职场文书
单位提档介绍信
2014/01/17 职场文书
教师对学生的评语
2014/04/28 职场文书
慈善晚会策划方案
2014/05/14 职场文书
银行青年文明号事迹材料
2014/05/31 职场文书
幼儿园社区活动总结
2014/07/07 职场文书
初三毕业感言
2015/07/31 职场文书
Python基础之元类详解
2021/04/29 Python
react国际化react-intl的使用
2021/05/06 Javascript