对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)

摘要:
首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已.下面先介绍一下WebUploader简介:WebUploader是由BaiduWebFE团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。采用大文件分片并发上传,极大的提高了文件上传效率。WebUploader.Uploader.support()){varerror="上传控件不支持您的浏览器!

首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已.

下面先介绍一下WebUploader

简介:

WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。

采用大文件分片并发上传,极大的提高了文件上传效率。

官网地址:http://fex.baidu.com/webuploader/

有兴趣想自己玩的的可以直接移步官网

下面我们开始正文内容:

正文

从上面我们可以看到百度的这个WebUploader功能确实很强大,但是和所有的上传控件一样,使用起来比较繁琐比如下面这样:

你需要先引用一大堆相关的类库,

然后还要写好HTML

对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)第1张

然后写大量的JS,比如:

复制代码
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
});
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   role="progressbar" style=" 0%">' +
          '</div>' +
        '</div>').appendTo( $li ).find('.progress-bar');
    }
    $li.find('p.state').text('上传中');
    $percent.css( 'width', percentage * 100 + '%' );
});
//....以下省略,配置各种参数和情况
复制代码

这些我们通通不要!,只要两句话,搞定我们的上传.如下:

//创建一个容器
<div   style="margin-left:10px"></div>
复制代码
 $(function () {
        //渲染容器
        $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 });
    })
    function GetFiles1() {
       //获取上传的文件地址
        var data = $("#uploader").GetFilesAddress();
        alert(data[0])
    }
复制代码

简单快捷,效果如下:

对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)第6张

我已经写好了bootstrap风格的css会自动引用,

支持多文件上传,

自动判别重复文件,

可选自动上传和手动上传,

可以页面中渲染多个上传控件,不冲突

然后一些WebUploader相关的配置参数都是可以直接自己配置的.

下面我们直接上我封装好的JS小插件(有点乱,大家凑合看):

复制代码
(function ($, window) {
    var applicationPath = window.applicationPath === "" ? "" : window.applicationPath || "../..";
    function SuiJiNum() {
        return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    }
    function initWebUpload(item, options) {
        if (!WebUploader.Uploader.support()) {
            var error = "上传控件不支持您的浏览器!请尝试升级flash版本或者使用Chrome引擎的浏览器。<a target='_blank' href='http://se.360.cn'>下载页面</a>";
            if (window.console) {
                window.console.log(error);
            }
            $(item).text(error);
            return;
        }
        //创建默认参数
        var defaults = {
            auto:true,
            hiddenInputId: "uploadifyHiddenInputId", // input hidden id
            onAllComplete: function (event) { }, // 当所有file都上传后执行的回调函数
            onComplete: function (event) { },// 每上传一个file的回调函数
            innerOptions: {},
            fileNumLimit: undefined,//验证文件总数量, 超出则不允许加入队列
            fileSizeLimit: undefined,//验证文件总大小是否超出限制, 超出则不允许加入队列。
            fileSingleSizeLimit: undefined,//验证单个文件大小是否超出限制, 超出则不允许加入队列
            PostbackHold: false
        };
        var opts = $.extend(defaults, options);
        var hdFileData = $("#" + opts.hiddenInputId);
        var target = $(item);//容器
        var pickerid = "";
        if (typeof guidGenerator36 != 'undefined')//给一个唯一ID
            pickerid = guidGenerator36();
        else
            pickerid = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
        var uploaderStrdiv = '<div class="webuploader">'
        debugger
        if (opts.auto) {
            uploaderStrdiv = 
            '<div   class="uploader-list"></div>' +
            '<div class="btns">' +
            '<div id="' + pickerid + '">选择文件</div>' +
            '</div>'
        } else {
            uploaderStrdiv = 
            '<div  class="uploader-list"></div>' +
            '<div class="btns">' +
            '<div id="' + pickerid + '">选择文件</div>' +
            '<button class="webuploadbtn">开始上传</button>' +
            '</div>'
        }
        uploaderStrdiv += '<div     >
                         </div>'
        uploaderStrdiv+='</div>';
        target.append(uploaderStrdiv);
        var $list = target.find('.uploader-list'),
             $btn = target.find('.webuploadbtn'),//手动上传按钮备用
             state = 'pending',
             $hiddenInput = target.find('.UploadhiddenInput'),
             uploader;
        var jsonData = {
            fileList: []
        };
        var webuploaderoptions = $.extend({
            // swf文件路径
            swf: applicationPath + '/Scripts/lib/webuploader/Uploader.swf',
            // 文件接收服务端。
            server:  '/Home/AddFile',
            deleteServer:'/Home/DeleteFile',
            // 选择文件的按钮。可选。
            // 内部根据当前运行是创建,可能是input元素,也可能是flash.
            pick: '#' + pickerid,
            //不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
            resize: false,
            fileNumLimit: opts.fileNumLimit,
            fileSizeLimit: opts.fileSizeLimit,
            fileSingleSizeLimit: opts.fileSingleSizeLimit
        },
        opts.innerOptions);
        var uploader = WebUploader.create(webuploaderoptions);
        //回发时还原hiddenfiled的保持数据
        var fileDataStr = hdFileData.val();
        if (fileDataStr && opts.PostbackHold) {
            jsonData = JSON.parse(fileDataStr);
            $.each(jsonData.fileList, function (index, fileData) {
                var newid = SuiJiNum();
                fileData.queueId = newid;
                $list.append('<div id="' + newid + '" class="item">' +
                '<div class="info">' + fileData.name + '</div>' +
                '<div class="state">已上传</div>' +
                '<div class="del"></div>' +
                '</div>');
            });
            hdFileData.val(JSON.stringify(jsonData));
        }
        if (opts.auto) {
            uploader.on('fileQueued', function (file) {
                debugger;
                $list.append('<div id="' + $(item)[0].id + file.id + '" class="item">' +
                   '<span class="webuploadinfo">' + file.name + '</span>' +
                   '<span class="webuploadstate">正在上传...</span>' +
                   '<div class="webuploadDelbtn">删除</div><br />' +
               '</div>');
                uploader.upload();
            });
        } else {
            uploader.on('fileQueued', function (file) {//队列事件
                $list.append('<div id="' + $(item)[0].id + file.id + '" class="item">' +
                    '<span class="webuploadinfo">' + file.name + '</span>' +
                    '<span class="webuploadstate">等待上传...</span>' +
                    '<div class="webuploadDelbtn">删除</div><br />' +
                '</div>');
            });
        }
        uploader.on('uploadProgress', function (file, percentage) {//进度条事件
            var $li = target.find('#' + $(item)[0].id + file.id),
                $percent = $li.find('.progress .bar');
            // 避免重复创建
            if (!$percent.length) {
                $percent = $('<span class="progress">' +
                    '<span  class="percentage"><span class="text"></span>' +
                  '<span   role="progressbar" style=" 0%">' +
                  '</span></span>' +
                '</span>').appendTo($li).find('.bar');
            }
            $li.find('span.webuploadstate').html('上传中');
            $li.find(".text").text(Math.round(percentage * 100) + '%');
            $percent.css('width', percentage * 100 + '%');
        });
        uploader.on('uploadSuccess', function (file, response) {//上传成功事件
            debugger
            if (response.state == "error") {
                target.find('#' + $(item)[0].id + file.id).find('span.webuploadstate').html(response.message);
            } else {
                target.find('#' + $(item)[0].id + file.id).find('span.webuploadstate').html('已上传');
                $hiddenInput.append('<input type="text" id="hiddenInput'+$(item)[0].id + file.id + '"   value="' + response.message + '" />')
            }
        });
        uploader.on('uploadError', function (file) {
            target.find('#' + $(item)[0].id + file.id).find('span.webuploadstate').html('上传出错');
        });
        uploader.on('uploadComplete', function (file) {//全部完成事件
            target.find('#' + $(item)[0].id + file.id).find('.progress').fadeOut();
        });
        uploader.on('all', function (type) {
            if (type === 'startUpload') {
                state = 'uploading';
            } else if (type === 'stopUpload') {
                state = 'paused';
            } else if (type === 'uploadFinished') {
                state = 'done';
            }
            if (state === 'uploading') {
                $btn.text('暂停上传');
            } else {
                $btn.text('开始上传');
            }
        });
        //删除时执行的方法
        uploader.on('fileDequeued', function (file) {
            debugger
            var fullName = $("#hiddenInput" + $(item)[0].id + file.id).val();
            if (fullName!=null) {
                $.post(webuploaderoptions.deleteServer, { fullName: fullName }, function (data) {
                    alert(data.message);
                })
            }
            $("#"+ $(item)[0].id + file.id).remove();
            $("#hiddenInput" + $(item)[0].id + file.id).remove();
        })
        //多文件点击上传的方法
        $btn.on('click', function () {
            if (state === 'uploading') {
                uploader.stop();
            } else {
                uploader.upload();
            }
        });
        //删除
        $list.on("click", ".webuploadDelbtn", function () {
            debugger
            var $ele = $(this);
            var id = $ele.parent().attr("id");
            var id = id.replace($(item)[0].id, "");
            var file = uploader.getFile(id);
            uploader.removeFile(file);
        });
    }
    $.fn.GetFilesAddress = function (options) {
        var ele = $(this);
        var filesdata = ele.find(".UploadhiddenInput");
        var filesAddress = [];
        filesdata.find(".hiddenInput").each(function () {
            filesAddress.push($(this).val());
        })
        return filesAddress;
    }
    $.fn.powerWebUpload = function (options) {
        var ele = this;
        if (typeof WebUploader == 'undefined') {
            var casspath = applicationPath + "/Scripts/webuploader/webuploader.css";
            $("<link>").attr({ rel: "stylesheet", type: "text/css", href: casspath }).appendTo("head");
            var jspath = applicationPath + "/Scripts/webuploader/webuploader.min.js";
            $.getScript(jspath) .done(function() {
                initWebUpload(ele, options);
            })
            .fail(function() {
                alert("请检查webuploader的路径是否正确!")
            });
        }
        else {
            initWebUpload(ele, options);
        }
    }
})(jQuery, window);
复制代码

一些相关的比较重要的参数都写了注释,大家自行参考即可.

然后我们来使用他.

//引入JS,记得要先引入jquery
<script src="http://t.zoukankan.com/~/Scripts/jquery-1.10.2.min.js"></script>
<script src="http://t.zoukankan.com/~/Scripts/MyWebUpload.js"></script>

写好我们的JS和HTML如下:

复制代码
<script>
    $(function () {
        $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 });
    })
    function GetFiles1() {
        var data = $("#uploader").GetFilesAddress();
        alert(data[0])
    }
</script>
<div   style="margin-left:10px"></div>
<input type="button" value="1111"  onclick="GetFiles1()"/>
复制代码

这样就OK了,值得注意的是

powerWebUpload中的参数请参考官网的API

GetFilesAddress()方法会返回上传之后文件路径的数组,大家自行获取.
最后上一个我写好的demo,采用Asp.net MVC实现的,大家自行下载:

百度网盘:

链接: http://pan.baidu.com/s/1o8B0xOQ 密码: 9kws

转自:http://www.cnblogs.com/GuZhenYin/p/5584272.html

免责声明:文章转载自《对百度WebUploader开源上传控件的二次封装,精简前端代码(两句代码搞定上传)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JQuery 之 Ajax 异步和同步浅谈Redis——redis使用redis-dump,redis-load导出导入数据——【三】下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

JSONP Hijackin攻击详解

如下文章是早期编写,有一些错误,建议读新写的文章:https://www.cnblogs.com/mysticbinary/p/12620152.html JSONP Hijackin的中文意思是JSON劫持,而能产生JSON数据劫持的原因在于前端被跨站攻击了。跨站=跨域,跨域从字面上理解的话,就是指超出了范围、领域。继续追问一下,那超出了什么范围?原来指...

小程序开发笔记(六)--使用七牛云上传图片

选取相册及本地预览 选择手机相册 preUpload() { let that = this; // let imglist=[]; wx.chooseImage({ count: 9, //最多可以选择的图片张数 sizeType: ["original", "compressed"],...

Html5 移动端 触摸滑动事件

以下代码经过测试  没有问题 且可以循环滑动 <!DOCTYPE html><html xmlns="http://www.w3.org/1999/xhtml"><head> <meta name="renderer" content="webkit"> <meta http-equiv="X-UA-C...

.net中RSA加密解密

1、产生密钥: private static void CreateKey() { using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider()) { string public...

DNS相关配置文件

我们晓得主机名对应到 IP 有两种方法,早期的方法是直接写在档案里面来对应, 后来比较新的方法则是透过 DNS 架构!那么这两种方法分别使用什么配置文件?可不可以同时存在? 若同时存在时,那个方法优先?嗯!我们先来谈一谈几个配置文件吧!* /etc/hosts :这个是最早的 hostname 对应 IP 的档案;* /etc/resolv.conf :这...

前端12 highcharts和echarts选择

运行测试https://jshare.com.cn/github/highcharts/highcharts/tree/master/samples/stock/chart/title-align/ https://bbs.hcharts.cn/forum.php 中文论坛hightcharts series接收数据 https://api.highcha...