前言
首先声明一下,我这个是对WebUploader开源上传控件的二次封装,底层还是WebUploader实现的,只是为了更简洁的使用他而已.
下面先介绍一下WebUploader
简介:
WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件。在现代的浏览器里面能充分发挥HTML5的优势,同时又不摒弃主流IE浏览器,沿用原来的FLASH运行时,兼容IE6+,iOS 6+, android 4+。两套运行时,同样的调用方式,可供用户任意选用。
采用大文件分片并发上传,极大的提高了文件上传效率。
官网地址//fex.baidu.com/webuploader/
有兴趣想自己玩的的可以直接移步官网
下面我们开始正文内容:
正文
从上面我们可以看到百度的这个WebUploader功能确实很强大,但是和所有的上传控件一样,使用起来比较繁琐比如下面这样:
你需要先引用一大堆相关的类库,
然后还要写好HTML
然后写大量的JS,比如:
- var uploader = WebUploader.create({
- // swf文件路径
- swf: BASE_URL + '/js/Uploader.swf',
- // 文件接收服务端。
- server: 'http://webuploader.duapp.com/server/fileupload.php',
- // 选择文件的按钮。可选。
- 10. // 内部根据当前运行是创建,可能是input元素,也可能是flash.
- 11. pick: '#picker',
- 12.
- 13. // 不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
- 14. resize: false
15. });
16. uploader.on( 'uploadProgress', function( file, percentage ) {
- 17. var $li = $( '#'+file.id ),
- 18. $percent = $li.find('.progress .progress-bar');
- 19.
- 20. // 避免重复创建
- 21. if ( !$percent.length ) {
- 22. $percent = $('<div class="progress progress-striped active">' +
- 23. '<div class="progress-bar" role="progressbar" style="width: 0%">' +
- 24. '</div>' +
- 25. '</div>').appendTo( $li ).find('.progress-bar');
- 26. }
- 27.
- 28. $li.find('p.state').text('上传中');
- 29.
- 30. $percent.css( 'width', percentage * 100 + '%' );
31. });
- 32.
33. //....以下省略,配置各种参数和情况
这些我们通通不要!,只要两句话,搞定我们的上传.如下:
- //创建一个容器
- <div id="uploader" style="margin-left:10px"></div>
- $(function () {
- //渲染容器
- $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 });
- })
- function GetFiles1() {
- //获取上传的文件地址
- 10. var data = $("#uploader").GetFilesAddress();
- 11. alert(data[0])
- 12. }
简单快捷,效果如下:
我已经写好了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()) {
- 10. var error = "上传控件不支持您的浏览器!请尝试升级flash版本或者使用Chrome引擎的浏览器。<a target='_blank' href='http://se.360.cn'>下载页面</a>";
- 11. if (window.console) {
- 12. window.console.log(error);
- 13. }
- 14. $(item).text(error);
- 15. return;
- 16. }
- 17. //创建默认参数
- 18. var defaults = {
- 19. auto:true,
- 20. hiddenInputId: "uploadifyHiddenInputId", // input hidden id
- 21. onAllComplete: function (event) { }, // 当所有file都上传后执行的回调函数
- 22. onComplete: function (event) { },// 每上传一个file的回调函数
- 23. innerOptions: {},
- 24. fileNumLimit: undefined,//验证文件总数量, 超出则不允许加入队列
- 25. fileSizeLimit: undefined,//验证文件总大小是否超出限制, 超出则不允许加入队列。
- 26. fileSingleSizeLimit: undefined,//验证单个文件大小是否超出限制, 超出则不允许加入队列
- 27. PostbackHold: false
- 28. };
- 29. var opts = $.extend(defaults, options);
- 30. var hdFileData = $("#" + opts.hiddenInputId);
- 31. var target = $(item);//容器
- 32. var pickerid = "";
- 33. if (typeof guidGenerator36 != 'undefined')//给一个唯一ID
- 34. pickerid = guidGenerator36();
- 35. else
- 36. pickerid = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
- 37. var uploaderStrdiv = '<div class="webuploader">'
- 38. debugger
- 39. if (opts.auto) {
- 40. uploaderStrdiv =
- 41. '<div id="Uploadthelist" class="uploader-list"></div>' +
- 42. '<div class="btns">' +
- 43. '<div id="' + pickerid + '">选择文件</div>' +
- 44. '</div>'
- 45.
- 46. } else {
- 47. uploaderStrdiv =
- 48. '<div class="uploader-list"></div>' +
- 49. '<div class="btns">' +
- 50. '<div id="' + pickerid + '">选择文件</div>' +
- 51. '<button class="webuploadbtn">开始上传</button>' +
- 52. '</div>'
- 53. }
- 54. uploaderStrdiv += '<div style="display:none" class="UploadhiddenInput" >\
- 55. </div>'
- 56. uploaderStrdiv+='</div>';
- 57. target.append(uploaderStrdiv);
- 58.
- 59. var $list = target.find('.uploader-list'),
- 60. $btn = target.find('.webuploadbtn'),//手动上传按钮备用
- 61. state = 'pending',
- 62. $hiddenInput = target.find('.UploadhiddenInput'),
- 63. uploader;
- 64. var jsonData = {
- 65. fileList: []
- 66. };
- 67.
- 68. var webuploaderoptions = $.extend({
- 69.
- 70. // swf文件路径
- 71. swf: applicationPath + '/Scripts/lib/webuploader/Uploader.swf',
- 72. // 文件接收服务端。
- 73. server: '/Home/AddFile',
- 74. deleteServer:'/Home/DeleteFile',
- 75. // 选择文件的按钮。可选。
- 76. // 内部根据当前运行是创建,可能是input元素,也可能是flash.
- 77. pick: '#' + pickerid,
- 78. //不压缩image, 默认如果是jpeg,文件上传前会压缩一把再上传!
- 79. resize: false,
- 80. fileNumLimit: opts.fileNumLimit,
- 81. fileSizeLimit: opts.fileSizeLimit,
- 82. fileSingleSizeLimit: opts.fileSingleSizeLimit
- 83. },
- 84. opts.innerOptions);
- 85. var uploader = WebUploader.create(webuploaderoptions);
- 86.
- 87. //回发时还原hiddenfiled的保持数据
- 88. var fileDataStr = hdFileData.val();
- 89. if (fileDataStr && opts.PostbackHold) {
- 90. jsonData = JSON.parse(fileDataStr);
- 91. $.each(jsonData.fileList, function (index, fileData) {
- 92. var newid = SuiJiNum();
- 93. fileData.queueId = newid;
- 94. $list.append('<div id="' + newid + '" class="item">' +
- 95. '<div class="info">' + fileData.name + '</div>' +
- 96. '<div class="state">已上传</div>' +
- 97. '<div class="del"></div>' +
- 98. '</div>');
- 99. });
- 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 class="bar" role="progressbar" style="width: 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 + '" class="hiddenInput" 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="~/Scripts/jquery-1.10.2.min.js"></script>
- <script src="~/Scripts/MyWebUpload.js"></script>
写好我们的JS和HTML如下:
- <script>
- $(function () {
- $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 });
- })
- function GetFiles1() {
- var data = $("#uploader").GetFilesAddress();
- alert(data[0])
- }
- </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