1. 程式人生 > >百度上傳控制元件WebUploader介紹

百度上傳控制元件WebUploader介紹

功能介紹

WebUploader是由Baidu開發的以HTML5為主,FLASH為輔的現代檔案上傳元件。在現代的瀏覽器裡面能充分發揮HTML5的優勢,同時又不摒棄主流IE瀏覽器,沿用原來的FLASH執行時,相容IE6+,iOS 6+, android 4+。兩套執行時,同樣的呼叫方式,可供使用者任意選用。具有以下特點

1. 瀏覽器相容性強

簡單的以HTML5為主,FLASH為輔的現代檔案上傳元件。在現代的瀏覽器裡面能充分發揮HTML5的優勢,同時又不摒棄主流IE瀏覽器,沿用原來的FLASH執行時,相容IE6+,iOS 6+, android 4+。兩套執行時,同樣的呼叫方式,可供使用者任意選用。

2. 分片、併發

分片與併發結合,將一個大檔案分割成多塊,併發上傳,極大地提高大檔案的上傳速度。
當網路問題導致傳輸錯誤時,只需要重傳出錯分片,而不是整個檔案。另外分片傳輸能夠更加實時的跟蹤上傳進度。

3. 預覽、壓縮

支援常用圖片格式jpg,jpeg,gif,bmp,png預覽與壓縮,節省網路資料傳輸。
解析jpeg中的meta資訊,對於各種orientation做了正確的處理,同時壓縮後上傳保留圖片的所有原始meta資料。

4. 多途徑新增檔案

支援檔案多選,型別過濾,拖拽(檔案&資料夾),圖片貼上功能。
貼上功能主要體現在當有圖片資料在剪下板中時(截圖工具如QQ(Ctrl + ALT + A), 網頁中右擊圖片點選複製),Ctrl + V便可新增此圖片檔案。

5. HTML5 & FLASH

相容主流瀏覽器,介面一致,實現了兩套執行時支援,使用者無需關心內部用了什麼核心。
同時Flash部分沒有做任何UI相關的工作,方便不關心flash的使用者擴充套件和自定義業務需求。

6. MD5秒傳

當檔案體積大、量比較多時,支援上傳前做檔案md5值驗證,一致則可直接跳過。
如果服務端與前端統一修改演算法,取段md5,可大大提升驗證效能,耗時在20ms左右。

7. 易擴充套件、可拆分

採用可拆分機制,將各個功能獨立成了小元件,可自由搭配。採用AMD規範組織程式碼,清晰明瞭,方便高階玩家擴充套件。

開發示例

引入JS和CSS
<script type="text/javascript" src='<%=path%>/js/jquery-1.10.2.min.js'></script>    
<link rel="stylesheet" type="text/css" href="<%=path%>/js/webuploader-0.1.5/webuploader.css">
<script type="text/javascript" src="<%=path%>/js/webuploader-0.1.5/webuploader.min.js"></script>

Webuploader包含以下檔案,可根據需要選擇引入

├── Uploader.swf                      // SWF檔案,當使用Flash執行時需要引入。
├── webuploader.js                    // 完全版本。
├── webuploader.min.js                // min版本

├── webuploader.flashonly.js          // 只有Flash實現的版本。
├── webuploader.flashonly.min.js      // min版本
├── webuploader.html5only.js          // 只有Html5實現的版本。
├── webuploader.html5only.min.js      // min版本
├── webuploader.withoutimage.js       // 去除圖片處理的版本,包括HTML5和FLASH.
└── webuploader.withoutimage.min.js   // min版本
檔案選擇區域
<div id="uploader" style="width:80%">
        <div id="fileDragContainer"  class="panel panel-info" style="width:80%">
            <div class="panel-heading">
                <h4>
                          請將簡歷拖拽至上傳區
                </h4>
            </div>
        <div id="fileList" style="weight:500px;height:300px;overflow-y :auto;border:1px solid #BCE8F1"></div>
    </div>
    <div class="btns">
        <div id="picker"><i class="icon-folder-open"></i>請選擇簡歷</div>
        <button id="btnUpload" class="btn btn-primary"><i class="icon-arrow-up"></i>開始上傳</button>
    </div>
</div>
WebUploader初始化
var uploader = WebUploader.create({
    //指定Drag And Drop拖拽的容器,如果不指定,則不啟動拖拽
    dnd:'#fileDragContainer',
    //是否禁掉整個頁面的拖拽功能,如果不禁用,圖片拖進來的時候會預設被瀏覽器開啟。
    disableGlobalDnd :document.body,
    //指定監聽paste事件的容器,如果不指定,不啟用此功能。此功能為通過貼上來新增截圖的圖片。建議設定為document.body
    paste:document.body,
    // swf檔案路徑,在IE9以下使用swf上傳
    swf : '<%=path%>/js/webuploader-0.1.5/Uploader.swf',
    // 檔案接收服務端地址
    server : '<%=path%>/upload',
    // 選擇檔案的按鈕。可選。
    // 內部根據當前執行是建立,可能是input元素,也可能是flash.
    pick : '#picker',
    // 不壓縮image, 預設如果是jpeg,檔案上傳前會壓縮一把再上傳!
    resize : false,
    // 設定檔案上傳域的name,預設為file
    fileVal : 'upfile',
    auto : false,
    //可通過formData將預設引數傳遞給伺服器
    formData : {
        initargs : 'initArgs'
    },
    //指定接受哪些型別的檔案
    accept:{
        title: '',
       extensions: 'doc,docx,html,mht,xls,xlsx,pdf',
        mimeTypes: ''
    },
    //檔案上傳執行緒數
    threads:1
});
WebUploader方法
$("#btnUpload").click(function() {
//動態設定引數
    uploader.options.formData.args ="1";
//上傳方法
uploader.upload();
});
WebUploader事件
//檔案加入佇列事件
uploader.on('fileQueued', function( file ) {
    $("#fileList").append( '<div id="' + file.id + '" class="item">' +'<h4 class="info">' + file.name + '</h4>' +
    '<p class="state">等待上傳...</p>' +'</div>' );
});
//檔案上傳進度監控事件
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 + '%' );
});
//檔案上傳成功事件
uploader.on( 'uploadSuccess', function( file,response) {
    //response是服務端的返回資料,json格式,如果服務端不是json格式,從response._raw中取資料,自行解析。
    if(response._raw =="ok"){
             $( '#'+file.id ).find('p.state').text('上傳成功');
    $( '#'+file.id ).fadeOut(3000);
    }else{
        $( '#'+file.id ).find('p.state').text('上傳失敗');
        $( '#'+file.id ).fadeOut(3000);
    }           
});
//檔案上傳失敗事件
uploader.on( 'uploadError', function( file ) {
    $( '#'+file.id ).find('p.state').text('上傳出錯');
});
//檔案上傳完成事件,不管成功或者失敗,在檔案上傳完後都會觸發uploadComplete事件
uploader.on( 'uploadComplete', function( file ) {
    $( '#'+file.id ).find('.progress').fadeOut();
});