百度WebUploader开源上传控件

前言
首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已.
下面先介绍一下WebUploader
简介:
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。
采用大文件分片并发上传,极大的提高了文件上传效率。
官网地址 //fex.baidu.com/webuploader/
有兴趣想自己玩的的可以直接移步官网
下面我们开始正文内容:
正文
从上面我们可以看到百度的这个WebUploader功能确实很强大,但是和所有的上传控件一样,使用起来比较繁琐比如下面这样:
你需要先引用一大堆相关的类库,
然后还要写好HTML
在这里插入图片描述

然后写大量的JS,比如:

  1. var uploader = WebUploader.create({
  2.  // swf文件路径
    
  3.  swf: BASE_URL + '/js/Uploader.swf',
    
  4.  // 文件接收服务端。
    
  5.  server: 'http://webuploader.duapp.com/server/fileupload.php',
    
  6.  // 选择文件的按钮。可选。
    
  7. // 内部根据当前运行是创建,可能是input元素,也可能是flash.
    
  8. pick: '#picker',
    
  9. // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
    
  10. resize: false
    
  11. });
  12. uploader.on( ‘uploadProgress’, function( file, percentage ) {
  13. var $li = $( '#'+file.id ),
    
  14.     $percent = $li.find('.progress .progress-bar');
    
  15. // 避免重复创建
    
  16. if ( !$percent.length ) {
    
  17.     $percent = $('<div class="progress progress-striped active">' +
    
  18.       '<div class="progress-bar" role="progressbar" style="width: 0%">' +
    
  19.       '</div>' +
    
  20.     '</div>').appendTo( $li ).find('.progress-bar');
    
  21. }
    
  22. $li.find('p.state').text('上传中');
    
  23. $percent.css( 'width', percentage * 100 + '%' );
    
  24. });
  25. //…以下省略,配置各种参数和情况
    这些我们通通不要!,只要两句话,搞定我们的上传.如下:
  26. //创建一个容器
  27. $(function () {
  28.      //渲染容器
    
  29.      $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 });
    
  30.  })
    
  31.  function GetFiles1() {
    
  32.     //获取上传的文件地址
    
  33.     var data = $("#uploader").GetFilesAddress();
    
  34.     alert(data[0])
    
  35. }
    

简单快捷,效果如下:
在这里插入图片描述

我已经写好了bootstrap风格的css会自动引用,
支持多文件上传,
自动判别重复文件,
可选自动上传和手动上传,
可以页面中渲染多个上传控件,不冲突
然后一些WebUploader相关的配置参数都是可以直接自己配置的.
下面我们直接上我封装好的JS小插件(有点乱,大家凑合看):

  1. (function ($, window) {
  2.  var applicationPath = window.applicationPath === "" ? "" : window.applicationPath || "../..";
    
  3.  function SuiJiNum() {
    
  4.      return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    
  5.  }
    
  6.  function initWebUpload(item, options) {
    
  7.      if (!WebUploader.Uploader.support()) {
    
  8.         var error = "上传控件不支持您的浏览器!请尝试升级flash版本或者使用Chrome引擎的浏览器。<a target='_blank' href='http://se.360.cn'>下载页面</a>";
    
  9.         if (window.console) {
    
  10.             window.console.log(error);
    
  11.         }
    
  12.         $(item).text(error);
    
  13.         return;
    
  14.     }
    
  15.     //创建默认参数
    
  16.     var defaults = {
    
  17.         auto:true,
    
  18.         hiddenInputId: "uploadifyHiddenInputId", // input hidden id
    
  19.         onAllComplete: function (event) { }, // 当所有file都上传后执行的回调函数
    
  20.         onComplete: function (event) { },// 每上传一个file的回调函数
    
  21.         innerOptions: {},
    
  22.         fileNumLimit: undefined,//验证文件总数量, 超出则不允许加入队列
    
  23.         fileSizeLimit: undefined,//验证文件总大小是否超出限制, 超出则不允许加入队列。
    
  24.         fileSingleSizeLimit: undefined,//验证单个文件大小是否超出限制, 超出则不允许加入队列
    
  25.         PostbackHold: false
    
  26.     };
    
  27.     var opts = $.extend(defaults, options);
    
  28.     var hdFileData = $("#" + opts.hiddenInputId);
    
  29.     var target = $(item);//容器
    
  30.     var pickerid = "";
    
  31.     if (typeof guidGenerator36 != 'undefined')//给一个唯一ID
    
  32.         pickerid = guidGenerator36();
    
  33.     else
    
  34.         pickerid = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
    
  35.     var uploaderStrdiv = '<div class="webuploader">'
    
  36.     debugger
    
  37.     if (opts.auto) {
    
  38.         uploaderStrdiv = 
    
  39.         '<div id="Uploadthelist" class="uploader-list"></div>' +
    
  40.         '<div class="btns">' +
    
  41.         '<div id="' + pickerid + '">选择文件</div>' +
    
  42.         '</div>'
    
  43.     } else {
    
  44.         uploaderStrdiv = 
    
  45.         '<div  class="uploader-list"></div>' +
    
  46.         '<div class="btns">' +
    
  47.         '<div id="' + pickerid + '">选择文件</div>' +
    
  48.         '<button class="webuploadbtn">开始上传</button>' +
    
  49.         '</div>'
    
  50.     }
    
  51.     uploaderStrdiv += '<div style="display:none" class="UploadhiddenInput" >\
    
  52.                      </div>'
    
  53.     uploaderStrdiv+='</div>';
    
  54.     target.append(uploaderStrdiv);
    
  55.     var $list = target.find('.uploader-list'),
    
  56.          $btn = target.find('.webuploadbtn'),//手动上传按钮备用
    
  57.          state = 'pending',
    
  58.          $hiddenInput = target.find('.UploadhiddenInput'),
    
  59.          uploader;
    
  60.     var jsonData = {
    
  61.         fileList: []
    
  62.     };
    
  63.     var webuploaderoptions = $.extend({
    
  64.         // swf文件路径
    
  65.         swf: applicationPath + '/Scripts/lib/webuploader/Uploader.swf',
    
  66.         // 文件接收服务端。
    
  67.         server:  '/Home/AddFile',
    
  68.         deleteServer:'/Home/DeleteFile',
    
  69.         // 选择文件的按钮。可选。
    
  70.         // 内部根据当前运行是创建,可能是input元素,也可能是flash.
    
  71.         pick: '#' + pickerid,
    
  72.         //不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
    
  73.         resize: false,
    
  74.         fileNumLimit: opts.fileNumLimit,
    
  75.         fileSizeLimit: opts.fileSizeLimit,
    
  76.         fileSingleSizeLimit: opts.fileSingleSizeLimit
    
  77.     },
    
  78.     opts.innerOptions);
    
  79.     var uploader = WebUploader.create(webuploaderoptions);
    
  80.     //回发时还原hiddenfiled的保持数据
    
  81.     var fileDataStr = hdFileData.val();
    
  82.     if (fileDataStr && opts.PostbackHold) {
    
  83.         jsonData = JSON.parse(fileDataStr);
    
  84.         $.each(jsonData.fileList, function (index, fileData) {
    
  85.             var newid = SuiJiNum();
    
  86.             fileData.queueId = newid;
    
  87.             $list.append('<div id="' + newid + '" class="item">' +
    
  88.             '<div class="info">' + fileData.name + '</div>' +
    
  89.             '<div class="state">已上传</div>' +
    
  90.             '<div class="del"></div>' +
    
  91.             '</div>');
    
  92.         });
    
  93.            hdFileData.val(JSON.stringify(jsonData));
    
  94.        }
    
  95.        if (opts.auto) {
    
  96.            uploader.on('fileQueued', function (file) {
    
  97.                debugger;
    
  98.                $list.append('<div id="' + $(item)[0].id + file.id + '" class="item">' +
    
  99.                   '<span class="webuploadinfo">' + file.name + '</span>' +
    
  100.                   '<span class="webuploadstate">正在上传...</span>' +
    
  101.                   '<div class="webuploadDelbtn">删除</div><br />' +
    
  102.               '</div>');
    
  103.                uploader.upload();
    
  104.            });
    
  105.        } else {
    
  106.            uploader.on('fileQueued', function (file) {
    
  107.    //队列事件
    
  108.                $list.append('<div id="' + $(item)[0].id + file.id + '" class="item">' +
    
  109.                    '<span class="webuploadinfo">' + file.name + '</span>' +
    
  110.                    '<span class="webuploadstate">等待上传...</span>' +
    
  111.                    '<div class="webuploadDelbtn">删除</div><br />' +
    
  112.                '</div>');
    
  113.            });
    
  114.        }
    
  115.        uploader.on('uploadProgress', function (file, percentage) {
    
  116.    //进度条事件
    
  117.            var $li = target.find('#' + $(item)[0].id + file.id),
    
  118.                $percent = $li.find('.progress .bar');
    
  119.            // 避免重复创建
    
  120.            if (!$percent.length) {
    
  121.                $percent = $('<span class="progress">' +
    
  122.                    '<span  class="percentage"><span class="text"></span>' +
    
  123.                  '<span class="bar" role="progressbar" style="width: 0%">' +
    
  124.                  '</span></span>' +
    
  125.                '</span>').appendTo($li).find('.bar');
    
  126.            }
    
  127.            $li.find('span.webuploadstate').html('上传中');
    
  128.            $li.find(".text").text(Math.round(percentage * 100) + '%');
    
  129.            $percent.css('width', percentage * 100 + '%');
    
  130.        });
    
  131.        uploader.on('uploadSuccess', function (file, response) {
    
  132.    //上传成功事件
    
  133.            debugger
    
  134.            if (response.state == "error") {
    
  135.                target.find('#' + $(item)[0].id + file.id).find('span.webuploadstate').html(response.message);
    
  136.            } else {
    
  137.                target.find('#' + $(item)[0].id + file.id).find('span.webuploadstate').html('已上传');
    
  138.                $hiddenInput.append('<input type="text" id="hiddenInput'+$(item)[0].id + file.id + '" class="hiddenInput" value="' + response.message + '" />')
    
  139.            }
    
  140.        });
    
  141.        uploader.on('uploadError', function (file) {
    
  142.            target.find('#' + $(item)[0].id + file.id).find('span.webuploadstate').html('上传出错');
    
  143.        });
    
  144.        uploader.on('uploadComplete', function (file) {
    
  145.    //全部完成事件
    
  146.            target.find('#' + $(item)[0].id + file.id).find('.progress').fadeOut();
    
  147.        });
    
  148.        uploader.on('all', function (type) {
    
  149.            if (type === 'startUpload') {
    
  150.                state = 'uploading';
    
  151.            } else if (type === 'stopUpload') {
    
  152.                state = 'paused';
    
  153.            } else if (type === 'uploadFinished') {
    
  154.                state = 'done';
    
  155.            }
    
  156.            if (state === 'uploading') {
    
  157.                $btn.text('暂停上传');
    
  158.            } else {
    
  159.                $btn.text('开始上传');
    
  160.            }
    
  161.        });
    
  162.        //删除时执行的方法
    
  163.        uploader.on('fileDequeued', function (file) {
    
  164.            debugger
    
  165.            var fullName = $("#hiddenInput" + $(item)[0].id + file.id).val();
    
  166.            if (fullName!=null) {
    
  167.                $.post(webuploaderoptions.deleteServer, { fullName: fullName }, function (data) {
    
  168.                    alert(data.message);
    
  169.                })
    
  170.            }
    
  171.            $("#"+ $(item)[0].id + file.id).remove();
    
  172.            $("#hiddenInput" + $(item)[0].id + file.id).remove();
    
  173.        })
    
  174.        //多文件点击上传的方法
    
  175.        $btn.on('click', function () {
    
  176.            if (state === 'uploading') {
    
  177.                uploader.stop();
    
  178.            } else {
    
  179.                uploader.upload();
    
  180.            }
    
  181.        });
    
  182.        //删除
    
  183.        $list.on("click", ".webuploadDelbtn", function () {
    
  184.            debugger
    
  185.            var $ele = $(this);
    
  186.            var id = $ele.parent().attr("id");
    
  187.            var id = id.replace($(item)[0].id, "");
    
  188.            var file = uploader.getFile(id);
    
  189.            uploader.removeFile(file);
    
  190.        });
    
  191.    }
    
  192.    $.fn.GetFilesAddress = function (options) {
    
  193.        var ele = $(this);
    
  194.        var filesdata = ele.find(".UploadhiddenInput");
    
  195.        var filesAddress = [];
    
  196.        filesdata.find(".hiddenInput").each(function () {
    
  197.            filesAddress.push($(this).val());
    
  198.        })
    
  199.        return filesAddress;
    
  200.    }
    
  201.    $.fn.powerWebUpload = function (options) {
    
  202.        var ele = this;
    
  203.        if (typeof WebUploader == 'undefined') {
    
  204.            var casspath = applicationPath + "/Scripts/webuploader/webuploader.css";
    
  205.            $("<link>").attr({ rel: "stylesheet", type: "text/css", href: casspath }).appendTo("head");
    
  206.            var jspath = applicationPath + "/Scripts/webuploader/webuploader.min.js";
    
  207.            $.getScript(jspath) .done(function() {
    
  208.                initWebUpload(ele, options);
    
  209.            })
    
  210.            .fail(function() {
    
  211.                alert("请检查webuploader的路径是否正确!")
    
  212.            });
    
  213.        }
    
  214.        else {
    
  215.            initWebUpload(ele, options);
    
  216.        }
    
  217.    }
    
  218. })(jQuery, window);
    一些相关的比较重要的参数都写了注释,大家自行参考即可.
    然后我们来使用他.
  219. //引入JS,记得要先引入jquery

写好我们的JS和HTML如下:

这样就OK了,值得注意的是
powerWebUpload中的参数请参考官网的API
GetFilesAddress()方法会返回上传之后文件路径的数组,大家自行获取.

参考文章:http://blog.ncmem.com/wordpress/2023/09/11/%e7%99%be%e5%ba%a6webuploader%e5%bc%80%e6%ba%90%e4%b8%8a%e4%bc%a0%e6%8e%a7%e4%bb%b6/
欢迎入群一起讨论
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值