首先聲明一下,我這個是對WebUploader開源上傳控件的二次封裝,底層仍是WebUploader實現的,只是爲了更簡潔的使用他而已.php
下面先介紹一下WebUploadercss
簡介:html
WebUploader是由Baidu WebFE(FEX)團隊開發的一個簡單的以HTML5爲主,FLASH爲輔的現代文件上傳組件。在現代的瀏覽器裏面能充分發揮HTML5的優點,同時又不摒棄主流IE瀏覽器,沿用原來的FLASH運行時,兼容IE6+,iOS 6+, android 4+。兩套運行時,一樣的調用方式,可供用戶任意選用。jquery
採用大文件分片併發上傳,極大的提升了文件上傳效率。android
官網地址:http://fex.baidu.com/webuploader/web
有興趣想本身玩的的能夠直接移步官網json
下面咱們開始正文內容:bootstrap
從上面咱們能夠看到百度的這個WebUploader功能確實很強大,可是和全部的上傳控件同樣,使用起來比較繁瑣好比下面這樣:數組
你須要先引用一大堆相關的類庫,瀏覽器
而後還要寫好HTML
而後寫大量的JS,好比:
var uploader = WebUploader.create({ // swf文件路徑 swf: BASE_URL + '/js/Uploader.swf', // 文件接收服務端。 server: 'http://webuploader.duapp.com/server/fileupload.php', // 選擇文件的按鈕。可選。 // 內部根據當前運行是建立,多是input元素,也多是flash. pick: '#picker', // 不壓縮image, 默認若是是jpeg,文件上傳前會壓縮一把再上傳! resize: false }); uploader.on( 'uploadProgress', function( file, percentage ) { var $li = $( '#'+file.id ), $percent = $li.find('.progress .progress-bar'); // 避免重複建立 if ( !$percent.length ) { $percent = $('<div class="progress progress-striped active">' + '<div class="progress-bar" role="progressbar" style="width: 0%">' + '</div>' + '</div>').appendTo( $li ).find('.progress-bar'); } $li.find('p.state').text('上傳中'); $percent.css( 'width', percentage * 100 + '%' ); }); //....如下省略,配置各類參數和狀況
這些咱們統統不要!,只要兩句話,搞定咱們的上傳.以下:
//建立一個容器 <div id="uploader" style="margin-left:10px"></div>
$(function () { //渲染容器 $("#uploader").powerWebUpload({ auto: false,fileNumLimit:5 }); }) function GetFiles1() { //獲取上傳的文件地址 var data = $("#uploader").GetFilesAddress(); alert(data[0]) }
簡單快捷,效果以下:
我已經寫好了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()) { var error = "上傳控件不支持您的瀏覽器!請嘗試升級flash版本或者使用Chrome引擎的瀏覽器。<a target='_blank' href='http://se.360.cn'>下載頁面</a>"; if (window.console) { window.console.log(error); } $(item).text(error); return; } //建立默認參數 var defaults = { auto:true, hiddenInputId: "uploadifyHiddenInputId", // input hidden id onAllComplete: function (event) { }, // 當全部file都上傳後執行的回調函數 onComplete: function (event) { },// 每上傳一個file的回調函數 innerOptions: {}, fileNumLimit: undefined,//驗證文件總數量, 超出則不容許加入隊列 fileSizeLimit: undefined,//驗證文件總大小是否超出限制, 超出則不容許加入隊列。 fileSingleSizeLimit: undefined,//驗證單個文件大小是否超出限制, 超出則不容許加入隊列 PostbackHold: false }; var opts = $.extend(defaults, options); var hdFileData = $("#" + opts.hiddenInputId); var target = $(item);//容器 var pickerid = ""; if (typeof guidGenerator36 != 'undefined')//給一個惟一ID pickerid = guidGenerator36(); else pickerid = (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); var uploaderStrdiv = '<div class="webuploader">' debugger if (opts.auto) { uploaderStrdiv = '<div id="Uploadthelist" class="uploader-list"></div>' + '<div class="btns">' + '<div id="' + pickerid + '">選擇文件</div>' + '</div>' } else { uploaderStrdiv = '<div class="uploader-list"></div>' + '<div class="btns">' + '<div id="' + pickerid + '">選擇文件</div>' + '<button class="webuploadbtn">開始上傳</button>' + '</div>' } uploaderStrdiv += '<div style="display:none" class="UploadhiddenInput" >\ </div>' uploaderStrdiv+='</div>'; target.append(uploaderStrdiv); var $list = target.find('.uploader-list'), $btn = target.find('.webuploadbtn'),//手動上傳按鈕備用 state = 'pending', $hiddenInput = target.find('.UploadhiddenInput'), uploader; var jsonData = { fileList: [] }; var webuploaderoptions = $.extend({ // swf文件路徑 swf: applicationPath + '/Scripts/lib/webuploader/Uploader.swf', // 文件接收服務端。 server: '/Home/AddFile', deleteServer:'/Home/DeleteFile', // 選擇文件的按鈕。可選。 // 內部根據當前運行是建立,多是input元素,也多是flash. pick: '#' + pickerid, //不壓縮image, 默認若是是jpeg,文件上傳前會壓縮一把再上傳! resize: false, fileNumLimit: opts.fileNumLimit, fileSizeLimit: opts.fileSizeLimit, fileSingleSizeLimit: opts.fileSingleSizeLimit }, opts.innerOptions); var uploader = WebUploader.create(webuploaderoptions); //回發時還原hiddenfiled的保持數據 var fileDataStr = hdFileData.val(); if (fileDataStr && opts.PostbackHold) { jsonData = JSON.parse(fileDataStr); $.each(jsonData.fileList, function (index, fileData) { var newid = SuiJiNum(); fileData.queueId = newid; $list.append('<div id="' + newid + '" class="item">' + '<div class="info">' + fileData.name + '</div>' + '<div class="state">已上傳</div>' + '<div class="del"></div>' + '</div>'); }); 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> <div id="uploader" style="margin-left:10px"></div> <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