架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 22870|回复: 1

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

[复制链接]
发表于 2016-6-27 15:13:30 | 显示全部楼层 |阅读模式
首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已.

下面先介绍一下WebUploader

简介:

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

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

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

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

下面我们开始正文内容:

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

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

然后还要写好HTML


653851-20160614151315542-1262731916.png

  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. //....以下省略,配置各种参数和情况
复制代码


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

  1. //创建一个容器
  2. <div id="uploader" style="margin-left:10px"></div>
复制代码


  1. $(function () {
  2.         //渲染容器
  3.         $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 });
  4.     })
  5.     function GetFiles1() {
  6.        //获取上传的文件地址
  7.         var data = $("#uploader").GetFilesAddress();
  8.         alert(data[0])
  9.     }
复制代码
653851-20160614151821057-211027941.png

我已经写好了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' >下载页面</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 + '/scrip{过滤}ts/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.             
  97.             uploader.on('fileQueued', function (file) {
  98.                 debugger;
  99.                 $list.append('<div id="' + $(item)[0].id + file.id + '" class="item">' +
  100.                    '<span class="webuploadinfo">' + file.name + '</span>' +
  101.                    '<span class="webuploadstate">正在上传...</span>' +
  102.                    '<div class="webuploadDelbtn">删除</div><br />' +
  103.                '</div>');
  104.                 uploader.upload();
  105.             });
  106.         } else {
  107.             uploader.on('fileQueued', function (file) {//队列事件
  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.       
  116.         
  117.         uploader.on('uploadProgress', function (file, percentage) {//进度条事件
  118.             var $li = target.find('#' + $(item)[0].id + file.id),
  119.                 $percent = $li.find('.progress .bar');

  120.             // 避免重复创建
  121.             if (!$percent.length) {
  122.                 $percent = $('<span class="progress">' +
  123.                     '<span  class="percentage"><span class="text"></span>' +
  124.                   '<span class="bar" role="progressbar" style="width: 0%">' +
  125.                   '</span></span>' +
  126.                 '</span>').appendTo($li).find('.bar');
  127.             }

  128.             $li.find('span.webuploadstate').html('上传中');
  129.             $li.find(".text").text(Math.round(percentage * 100) + '%');
  130.             $percent.css('width', percentage * 100 + '%');
  131.         });
  132.         uploader.on('uploadSuccess', function (file, response) {//上传成功事件
  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.             target.find('#' + $(item)[0].id + file.id).find('.progress').fadeOut();

  146.         });

  147.         uploader.on('all', function (type) {
  148.             if (type === 'startUpload') {
  149.                 state = 'uploading';
  150.             } else if (type === 'stopUpload') {
  151.                 state = 'paused';
  152.             } else if (type === 'uploadFinished') {
  153.                 state = 'done';
  154.             }

  155.             if (state === 'uploading') {
  156.                 $btn.text('暂停上传');
  157.             } else {
  158.                 $btn.text('开始上传');
  159.             }
  160.         });

  161.         //删除时执行的方法
  162.         uploader.on('fileDequeued', function (file) {
  163.             debugger
  164.             
  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.         //多文件点击上传的方法
  176.         $btn.on('click', function () {
  177.             if (state === 'uploading') {
  178.                 uploader.stop();
  179.             } else {
  180.                 uploader.upload();
  181.             }
  182.         });

  183.         //删除
  184.         $list.on("click", ".webuploadDelbtn", function () {
  185.             debugger
  186.             var $ele = $(this);
  187.             var id = $ele.parent().attr("id");
  188.             var id = id.replace($(item)[0].id, "");

  189.             var file = uploader.getFile(id);
  190.             uploader.removeFile(file);
  191.         });

  192.     }
  193.     $.fn.GetFilesAddress = function (options) {
  194.         var ele = $(this);
  195.         var filesdata = ele.find(".UploadhiddenInput");
  196.         var filesAddress = [];
  197.         filesdata.find(".hiddenInput").each(function () {
  198.             filesAddress.push($(this).val());
  199.         })
  200.         return filesAddress;
  201.         
  202.     }

  203.     $.fn.powerWebUpload = function (options) {
  204.         var ele = this;
  205.         if (typeof WebUploader == 'undefined') {
  206.             var casspath = applicationPath + "/scrip{过滤}ts/webuploader/webuploader.css";
  207.             $("<link>").attr({ rel: "stylesheet", type: "text/css", href: casspath }).appendTo("head");
  208.             var jspath = applicationPath + "/scrip{过滤}ts/webuploader/webuploader.min.js";
  209.             $.getscrip{过滤}t(jspath) .done(function() {
  210.                 initWebUpload(ele, options);
  211.             })
  212.             .fail(function() {
  213.                 alert("请检查webuploader的路径是否正确!")
  214.             });
  215.            
  216.         }
  217.         else {
  218.             initWebUpload(ele, options);
  219.         }
  220.     }
  221. })(jQuery, window);
复制代码


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

然后我们来使用他.


  1. //引入JS,记得要先引入jquery
  2. <scrip{过滤}t src="~/scrip{过滤}ts/jquery-1.10.2.min.js"></scrip{过滤}t>
  3. <scrip{过滤}t src="~/scrip{过滤}ts/MyWebUpload.js"></scrip{过滤}t>
复制代码



写好我们的JS和HTML如下:

  1. <scrip{过滤}t>
  2.     $(function () {
  3.         $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 });
  4.     })
  5.     function GetFiles1() {
  6.         var data = $("#uploader").GetFilesAddress();
  7.         alert(data[0])
  8.     }
  9. </scrip{过滤}t>
  10. <div id="uploader" style="margin-left:10px"></div>
  11. <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






上一篇:.net下的抓包工具SharpPcap写的
下一篇:html 文件上传框 input标签
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2020-5-4 21:03:04 | 显示全部楼层
不错!!!!
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2026-7-31 14:41

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表