首页 > 其他分享 >百度WebUploader开源上传控件

百度WebUploader开源上传控件

时间:2023-09-11 09:23:31浏览次数:55  
标签:function 控件 uploader 开源 WebUploader file var 上传 id

前言

首先声明一下,我这个是对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/

欢迎入群一起讨论

 

 

标签:function,控件,uploader,开源,WebUploader,file,var,上传,id
From: https://www.cnblogs.com/songsu/p/17692642.html

相关文章

  • 【愚公系列】2023年09月 WPF控件专题 DockPanel控件详解
    (文章目录)前言WPF控件是WindowsPresentationFoundation(WPF)中的基本用户界面元素。它们是可视化对象,可以用来创建各种用户界面。WPF控件可以分为两类:原生控件和自定义控件。原生控件是由Microsoft提供的内置控件,如Button、TextBox、Label、ComboBox等。这些控件都是WPF中常见......
  • Golang(又称Go语言)是一种开源的静态强类型编程语
    Golang(又称Go语言)是一种开源的静态强类型编程语言,巧瞒七星解磐键由Google在2007年开始开发,并于2009年发布。它的设计目标是提供一种简洁、高效的语言,同时具备高并发、高性能的特性。Golang的语法风格简洁明了,易于上手,适用于各种规模的项目。下面将介绍Golang在实际应用中的具体案......
  • 机构企业学员培训知识付费小程序开源版开发
    机构企业学员培训知识付费小程序开源版开发用户注册与登录:提供用户注册和登录功能,以便用户能够访问和使用小程序。个人信息管理:允许用户管理个人资料,包括修改个人信息和上传个人头像。课程浏览:提供课程列表,包括课程名称、简介、讲师信息和价格等详细信息,以便用户浏览和选择感兴趣的......
  • C#开发的基础工具类集合 - 开源研究系列文章
          今天发布一个基础工具类代码集合。      以前有发布过一个类似的类库(见博文:Magical平台类库代码分享),不过那个版本有点久了,也没有这次这个全面,这次发布的是一个很多地方用到的基础类库代码。1、项目目录;项目底下就是DLL类库的代码: 2......
  • C# chart 控件操作
    Annotations:图表批注集合ChartAreas:添加成员ChartArea,轴AxesXaxisY(Value)axisTitle:轴标题StripLines:自定义条带和线条TextOreintation:文本方向Legends:(图表图例)if......
  • 开源药店商城系统源码比较:哪个适合你的药品电商业务
    在构建药品电商业务时,选择适合的药店商城系统源码是至关重要的决策之一。开源药店商城系统源码提供了快速入门的机会,但在选择之前,您需要仔细考虑您的需求、技术要求和可扩展性。本文将比较几个流行的开源药店商城系统源码,以帮助您找到最适合您业务的选项。1.MagentoMagento是一个......
  • 基于物联网技术的开源工业固体废物一体化智能监控平台
    ​ 一、项目背景    “十四五”时期,我国将开启全面建设社会主义现代化国家新征程,围绕推动高质量发展主题,全面提高资源利用效率的任务更加迫切。受资源禀赋、能源结构、发展阶段等因素影响,未来我国大宗固废仍面临产生强度高、利用不充分、综合利用产品附加值低的严峻形势......
  • IDEFICS 简介: 最先进视觉语言模型的开源复现
    引言CodeLlama是为代码类任务而生的一组最先进的、开放的Llama2模型,我们很高兴能将其集成入HuggingFace生态系统!CodeLlama使用与Llama2相同的社区许可证,且可商用。今天,我们很高兴能发布HuggingFace对CodeLlama的全面支持,包括:Hub上的模型支持,包括模型......
  • 百度开源网关BFE源代码阅读
    BFE是一个非常强大的七层负载均衡,与其他负载均衡存在一些显著的差异(Product,GSLB等概念),也因为这些差异所以对于没有阅读其代码的用户在入门阶段非常的不友好,再者就是官方文档仅是一个查阅文档,这个查阅文档会的看得懂,不会的看不懂,对于教会用户怎么用实在是没有太多的帮助,所以笔......
  • 表单引擎的自定义控件的概念与设计
    基本概念概述控件的定义:用于展示或者采集数据的表单元素,称为控件,比如:文本框、下拉框、单选按钮、从表等.自定义控件:表单引擎提供的基础控件之外的控件称为自定义控件,这些控件由开发人员自己定义,比如:评分、公文字号、定位等.基本控件分类字段控件:文本字段、数值字段、日期字段、......