對百度WebUploader開源上傳控件的二次封裝,精簡前端代碼(兩句代碼搞定上傳)

首先聲明一下,我這個是對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

相關文章
相關標籤/搜索