Web Uploader文件上传插件使用详解


Posted in Javascript onMay 10, 2016

WebUploader文件上传组件在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。 采用大文件分片并发上传,极大的提高了文件上传效率。

Web Uploader文件上传插件使用详解

一、功能介绍

分片、并发

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

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

预览、压缩

支持常用图片格式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规范组织代码,清晰明了,方便高级玩家扩展。

引入资源

使用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在初始化的时候指定,在后面将展示-->

二、文件上传
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();
});

三、图片上传
与普通文件上传相比,此demo演示了:文件过滤,图片预览,图片压缩上传等功能。

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('上传失败');
});

// 完成上传完了,成功或者失败,先删除进度条。
uploader.on( 'uploadComplete', function( file ) {
 $( '#'+file.id ).find('.progress').remove();
});

以上就是关于Web Uploader文件上传插件使用方法介绍,希望对大家的学习有所帮助。

Javascript 相关文章推荐
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
Jun 08 Javascript
js与运算符和或运算符的妙用
Feb 14 Javascript
生成二维码方法汇总
Dec 26 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
Mar 02 Javascript
javascript实现简单查找与替换的方法
Jul 22 Javascript
vue addRoutes实现动态权限路由菜单的示例
May 15 Javascript
详解如何用webpack4从零开始构建react开发环境
Jan 27 Javascript
如何为你的JavaScript代码日志着色详解
Apr 08 Javascript
使用vue2.6实现抖音【时间轮盘】屏保效果附源码
Apr 24 Javascript
jQuery+ThinkPHP实现图片上传
Jul 23 jQuery
微信小程序实现购物车小功能
Dec 30 Javascript
react 路由Link配置详解
Nov 11 Javascript
详解原生JavaScript实现jQuery中AJAX处理的方法
May 10 #Javascript
JS上传组件FileUpload自定义模板的使用方法
May 10 #Javascript
使用jQuery处理AJAX请求的基础学习教程
May 10 #Javascript
javascript关于继承解析
May 10 #Javascript
JavaScript继承学习笔记【新手必看】
May 10 #Javascript
实例讲解使用原生JavaScript处理AJAX请求的方法
May 10 #Javascript
深入剖析JavaScript:Object类型
May 10 #Javascript
You might like
codeigniter中实现一次性加载多个view的方法
2015/03/20 PHP
php实现每天自动变换随机问候语的方法
2015/05/12 PHP
利用PHP实现开心消消乐的算法示例
2017/10/12 PHP
PHP封装的page分页类定义与用法完整示例
2018/12/24 PHP
thinkphp框架无限级栏目的排序功能实现方法示例
2020/03/29 PHP
PHP dirname简单使用代码实例
2020/11/13 PHP
IE JS无提示关闭窗口不提示的方法
2010/04/29 Javascript
JavaScript全排列的六种算法 具体实现
2013/06/29 Javascript
Jquery ajax执行顺序 返回自定义错误信息(实例讲解)
2013/11/06 Javascript
js如何获取object类型里的键值
2014/02/18 Javascript
使用upstart把nodejs应用封装为系统服务实例
2014/06/01 NodeJs
javascript实现类似超链接的效果
2014/12/26 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
jQuery EasyUI 右键菜单--关闭标签/选项卡的简单实例
2016/10/10 Javascript
Vue组件中slot的用法
2018/01/30 Javascript
vue3.0 CLI - 2.5 - 了解组件的三维
2018/09/14 Javascript
vue 音乐App QQ音乐搜索列表最新接口跨域设置方法
2018/09/25 Javascript
JavaScript 实现HTML DOM增删改查操作的常见方法详解
2020/01/04 Javascript
Vue实现浏览器打印功能的代码
2020/04/17 Javascript
可拖拽组件slider.js使用方法详解
2020/12/04 Javascript
[49:35]LGD vs OG 2018国际邀请赛淘汰赛BO3 第二场 8.25
2018/08/29 DOTA
Python2与Python3的区别实例分析
2019/04/11 Python
Python实现 PS 图像调整中的亮度调整
2019/06/28 Python
pytorch数据预处理错误的解决
2020/02/20 Python
pycharm中选中一个单词替换所有重复单词的实现方法
2020/11/17 Python
世界上最好的帽子:Tilley
2016/11/27 全球购物
澳大利亚女士时装在线:Rockmans
2018/09/26 全球购物
2014年大学生预备党员思想汇报1000字
2014/09/13 职场文书
代理人委托书
2014/09/16 职场文书
学校总务处领导班子民主生活会对照检查材料思想汇报
2014/09/27 职场文书
小学感恩节活动策划方案
2014/10/06 职场文书
大二学生自我检讨书
2014/10/23 职场文书
项目转让协议书
2014/10/27 职场文书
婚礼新人答谢词
2015/01/04 职场文书
学年个人总结范文
2015/03/05 职场文书
Win11任务栏无法正常显示 资源管理器不停重启的解决方法
2022/07/07 数码科技