百度WebUploader开源上传控件

发布时间 2023-09-11 09:17:07作者: Xproer-松鼠

前言

首先声明一下,我这个是对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.  
  3.     // swf文件路径
  4.     swf: BASE_URL + '/js/Uploader.swf',
  5.  
  6.     // 文件接收服务端。
  7.     server: 'http://webuploader.duapp.com/server/fileupload.php',
  8.  
  9.     // 选择文件的按钮。可选。
  10. 10.     // 内部根据当前运行是创建,可能是input元素,也可能是flash.
  11. 11.     pick: '#picker',
  12. 12.  
  13. 13.     // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
  14. 14.     resize: false

15. });

16. uploader.on( 'uploadProgress', function( file, percentage ) {

  1. 17.     var $li = $( '#'+file.id ),
  2. 18.         $percent = $li.find('.progress .progress-bar');
  3. 19.  
  4. 20.     // 避免重复创建
  5. 21.     if ( !$percent.length ) {
  6. 22.         $percent = $('<div class="progress progress-striped active">' +
  7. 23.           '<div class="progress-bar" role="progressbar" style="width: 0%">' +
  8. 24.           '</div>' +
  9. 25.         '</div>').appendTo( $li ).find('.progress-bar');
  10. 26.     }
  11. 27.  
  12. 28.     $li.find('p.state').text('上传中');
  13. 29.  
  14. 30.     $percent.css( 'width', percentage * 100 + '%' );

31. });

  1. 32.  

33. //....以下省略,配置各种参数和情况

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

  1. //创建一个容器
  2. <div id="uploader" style="margin-left:10px"></div>
  3.  
  4. $(function () {
  5.         //渲染容器
  6.         $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 });
  7.     })
  8.     function GetFiles1() {
  9.        //获取上传的文件地址
  10. 10.         var data = $("#uploader").GetFilesAddress();
  11. 11.         alert(data[0])
  12. 12.     }

简单快捷,效果如下:

 

 

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

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

然后我们来使用他.

  1. //引入JS,记得要先引入jquery
  2. <script src="~/Scripts/jquery-1.10.2.min.js"></script>
  3. <script src="~/Scripts/MyWebUpload.js"></script>

写好我们的JS和HTML如下:

  1. <script>
  2.     $(function () {
  3.         $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 });
  4.     })
  5.     function GetFiles1() {
  6.         var data = $("#uploader").GetFilesAddress();
  7.         alert(data[0])
  8.     }
  9. </script>

10. <div id="uploader" style="margin-left:10px"></div>

11. <input type="button" value="1111"  onclick="GetFiles1()"/>

这样就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/

欢迎入群一起讨论