1. 程式人生 > >百度上傳元件web uploader介紹+快速入門案例

百度上傳元件web uploader介紹+快速入門案例

百度上傳元件web uploader入門

公司的專案需要檔案上傳的功能,之前使用的是SWFUpload這個上傳元件,我將其替換成了web uploader。

SWFUpload元件

SWFUpload 最初是Vinterwebb.se 開發的客戶端檔案上傳工具。它聯合javascript和flash,在瀏覽器中提供一個優於傳統上傳標籤 的功能(和良好的使用者體驗)。

SWFUpload 的主要特性:

檔案瀏覽對話方塊中可以選擇多個檔案
AJAX風格的上傳,不用重重新整理
上傳過程中的各種事件.
可以在客戶端調節圖片大小
它使用的類名稱空間相容各種js庫(i.e., jQuery, Prototype, 等.).
支援 Flash 9 and Flash 10 (2.2.0版本後取消對flash 8的支援)
SWFUpload 的設計理念與其他基於flash的上傳工具不同。SWFUpload 給開發者儘可能多的UI控制能力. 開發者可以使用 XHTML, CSS, JavaScript 來使它更符合自己網站的樣式風格. 它提供一組簡單的js事件更新上傳狀態,開發者可以根據這些事件來在網頁中顯示檔案上傳進度

不過不幸的是 Flash Player 10 迫使我們不得不用一個按鈕(點選後)才能觸發檔案選擇對話方塊,但SWFUpload允許開發者用js來修改這個按鈕的文字等外觀。

從介紹可以看出這個元件是比較老的,主要使用flash來實現上傳,在傳統上傳標籤 無法實現多檔案上傳的時候,他使用flash來實現了。但是新的HTML5中,新加入了multiple屬性,只要就可以直接實現多檔案上傳,此時flash就顯得沒有必要了。

所以經過一些瞭解之後,我選擇了百度的web Uploader這個上傳元件。

百度 web uploader元件

WebUploader是由Baidu WebFE(FEX)團隊開發的一個簡單的以HTML5為主,FLASH為輔的現代檔案上傳元件。在現代的瀏覽器裡面能充分發揮HTML5的優勢,同時又不摒棄主流IE瀏覽器,沿用原來的FLASH執行時,相容IE6+,iOS 6+, android 4+。兩套執行時,同樣的呼叫方式,可供使用者任意選用。
採用大檔案分片併發上傳,極大的提高了檔案上傳效率。

該外掛使用了HTML5的新特性,以傳統的input file 為主,結合flash,使得他在相容性方面有很大的優勢。同時支援移動端上傳,非常強大。

簡單示例和解釋

下面是一個簡單的示例,我詳細做了註釋:


  //初始化Packing list_uploader物件
var Packing_list_uploader = WebUploader.create({
      // swf檔案路徑 
      swf:  'js/webuploader/webuploader-0.1.5/Uploader.swf',
      // 檔案接收服務端。
      server: 'UploadOrderFile.action'
, // 選擇檔案的按鈕。可選。 // 內部根據當前執行是建立,可能是input元素,也可能是flash. pick: { "id":'#packinglist_show_falsh', "multiple":false //禁止多選。 }, // 檔案進入佇列後自動開始上傳 auto: true, //分片上傳設定 chunked:true, //允許分片 chunkSize:2*1024*1024, //每片大小2M chunkRetry:4, //分片上傳失敗之後的重試次數 threads:3, //上傳併發數。允許同時最大3個上傳程序 //去重 duplicate:true, //上傳檔案個數限制 fileNumLimit:20, //單個檔案大小限制 20M fileSingleSizeLimit:20*1024*1024, //傳入檔案格式限制,只能上傳doc,docx,pdf格式的檔案 accept: { title: 'Applications', extensions: 'doc,docx,pdf', mimeTypes: 'application/pdf, application/msword' }, //重要引數:跟後臺檔案元件的對接引數,後臺檔案元件叫做upload。 fileVal:"upload", //傳入引數。這兩個引數會跟檔案一起傳給後臺,用於跟後臺對接,確認檔案的來源。 formData:{ //這裡的兩個引數是為了跟後臺對接,讓後臺知道上傳的檔案存在哪裡。 "ttype":"qc_packinglist", "task":"createqc" }, });

上邊的部分就是上傳物件的初始化,我這裡是檔案上傳,跟圖片上傳略有差異,還有其他很多引數,可以去官網查詢API,都寫得很清楚。

由於我實在專案中替換原有的上傳元件,所以不希望改動介面佈局和UI,直接將之前的佈局沿用過來,通過id讓元件和頁面div聯絡起來。
所以我給初始化之後的物件,增加了一系列屬性,屬性值設為HTML中相應部分的標籤id,通過這些id,在事件中編寫相應的函式,可以在不改變介面佈局和UI的前提下替換元件。下面是我增加的屬性和值。


//給Packing list_uploader物件增加我們自己專案所需要的下列屬性:
Packing_list_uploader.bar_id="packing_list_file_panel",        //檔案上傳面板,檔案顯示,進度條,被他包裹在裡邊。       
Packing_list_uploader.full_progress_bar_id="packing_report_bar",     //進度條總長度的div
Packing_list_uploader.percent_bar_id="packing_report_progress_bar",   //進度條width變化的div
Packing_list_uploader.related_var="PackingList",     //realated_var表示相關的變數,在一個<input type="hidden">標籤中,不在網頁中顯示,一般用來傳遞引數。檔案上傳之後value的值變為has,若必填,檢驗value的值是否為空。
Packing_list_uploader.file_link_id="packinglist_file_link",           //檔案上傳成功後在id為 order_link的<a>標籤中顯示檔名,點選可以下載。
Packing_list_uploader.swf_panel_id="packinglist_show_falsh",     //放上傳flash圖示的地方           
Packing_list_uploader.del_panel_id="packinglist_show_delete";    //放刪除flash圖示的地方
//這裡多設定了type和task,是因為我沒法取得web uploader本身的formDate中的ttype和task的值,不然是可以直接用他們的。
Packing_list_uploader.type="qc_packinglist";
Packing_list_uploader.task="createqc";

最後,得到了需要的物件之後,還需要根據web uploader元件自帶的事件來繫結事件函式,得到自己需要的效果。下邊的程式碼是我設定的事件繫結。


//給Packing_list_uploader物件繫結事件和事件函式
//當發生錯誤的時候觸發,判斷錯誤型別,並返回相應的提示。
Packing_list_uploader.on("error",show_error); 
// 當有檔案新增進來的時候,在檔案列表中插入div節點,在網頁中顯示被插入的檔案,包含檔名和等待上傳和移除
Packing_list_uploader.on( 'fileQueued',queued );        
// 檔案上傳過程中建立進度條實時顯示。上傳過程中觸發uploadProgress事件,執行函式:
Packing_list_uploader.on( 'uploadProgress',uploading );
//上傳成功後顯示檔案,切換到刪除鍵等。
Packing_list_uploader.on( 'uploadSuccess',upload_ok );

上邊的程式碼中我綁定了一些事件函式,這些函式我寫在下邊了,也有詳細的註釋。而且可以支援不同的上傳框複用。


//下邊所有的函式,都是需要上傳的時候公用的函式。不同的uploader物件共用的事件繫結函式  和  這些事件繫結函式中需要呼叫的函式。
//發生錯誤時候呼叫的函式
var show_error=function show_error(type){
    if (type=="Q_EXCEED_NUM_LIMIT"){
        alert("此處檔案數量不能大於1個");
    }else if(type=="F_EXCEED_SIZE"){
        alert("此處檔案大小不能大於20M");
    }else if(type=="Q_TYPE_DENIED"){
        alert("此處檔案型別必須是XXX");
    }
};
//檔案進入佇列時呼叫的函式
var queued=function queued( file ) {
    $("#"+this.bar_id).html("");  //將bar_id物件中的內容清空
    var  div='<li><div id="'+this.full_progress_bar_id + '" style="position:relative;width:183px;left:10px;height:8px;display:inline-block;border:1px solid #ccc;list-style:none;margin-top:6px;"><div id="' + this.percent_bar_id +'" style="position:absolute;background-color:#F36861;width:0%;height:8px"></div></div></li>';
    $("#"+this.bar_id).append( div);   //加入顯示進度條所需的div
};
//檔案上傳過程中呼叫的函式
var uploading=function( file, percentage ) {
    $("#"+this.percent_bar_id).css( 'width', percentage * 100 + '%');      
};
//檔案上傳成功後呼叫的函式
var upload_ok=function( file ) {     //上傳成功時觸發uploadSuccess函式,將之前的  上傳中  再替換為   已上傳。
    //呼叫GetFileList函式,該函式下邊
    GetFileList(this.type, this.task, this.bar_id, this.related_var,100, this.file_link_id);
    //$("#"+this.related_var).next().find("label").remove();//清除上傳檔案提示
    $("#" + this.swf_panel_id).hide();     //上傳成功後隱藏上傳的flash按鈕     
    $("#" + this.del_panel_id).show();     //上傳成功後顯示刪除檔案的flash按鈕  
    //取出對應例項    的引數
    var type = this.type;
    var task = this.task;
    var swf_panel_id = this.swf_panel_id;
    var del_panel_id = this.del_panel_id;
    var file_link_id = this.file_link_id;
    var related_var = this.related_var; 
    $("#" + this.del_panel_id).click(function(){   //給  刪除檔案的flash按鈕的  click事件繫結    刪除上傳的檔案    的函式
        //切換回到上傳檔案的狀態。      該函式在下邊。
        removeUploadFile(type, task, swf_panel_id, file_link_id, del_panel_id);
        $("#" + related_var ).val("");
    });
};
//下面是一些上邊的呼叫函式中需要呼叫的函式:
//取得上傳成功的檔案,通過該檔案製作一個用於點選下載的<a>標籤,放入檔案上傳的地方。
function GetFileList( ty,task, divname,varname, max_len, f_id )
{
    var url = 'GetFileList.action';
    var params = {"type":ty, "task":task };
    $.ajax({
        url:url,
        type:"POST",
        data:params,
        dataType:"json",
        success:function (data){
            var storeObj = document.getElementById(divname);  
            var t=storeObj.childNodes.length;
            for(var i=t-1;i>=0;i--)
            {
                storeObj.removeChild(storeObj.childNodes[i]);
            }
            for(var i = 0 ; i <data.list.length; i ++)
            {
                var li= document.createElement("li");
                var filename =  data.list[i].filename;
                if( max_len != null && max_len !=undefined && max_len != 'undefined' ){

                }
                //上傳成功後顯示檔名字(若太長則顯示一部分+省略號...+副檔名),可下載的連結。
                li.innerHTML="<a id='"+ f_id + "' href='Download.action?fileid=" + data.list[i].fid+ "' title='" + filename + "'>"+decreaseString(filename,20,true)+" </a>";
                storeObj.appendChild(li);
            } 
            if( data.list.length > 0 )
            {
                var  vv = document.getElementById(varname);
                if( vv != null )
                    vv.value = "has";
            }
        }
    });
}
//根據傳入的引數type,task跟後臺通訊定位檔案,刪除成功,那麼使用上邊的switch_delete函式重新切換到上傳檔案的狀態。
function  removeUploadFile( type, task, swf_panel_id, swf_filebar_id, del_panel_id ){
    var url = 'RemoveUploadFile.action';    //通訊刪除動作
    var params = {"type":type, "task":task };
    $.ajax({
        url:url,
        type:"POST",
        data:params,
        dataType:"json",
        success:function(jdata){
            if( jdata.result=="success"){   //判斷刪除是否成功。
                //刪除成功後重新切換到上傳檔案。
                switch_delete(swf_panel_id, del_panel_id, swf_filebar_id);
            }
        },
    });
}
//(點選刪除檔案後)重新切換到上傳檔案
function switch_delete( flash_id, delete_id, fileplace_id ){    
    $("#" + flash_id).show();      //顯示上傳檔案的按鈕
    $("#" + delete_id ).hide();       //隱藏刪除檔案的按鈕
    $("#" + fileplace_id ).replaceWith("<li style='text-align:center;color:#BDC3C7;font-size:13px;'>Upload you document</li>");   //將顯示區域的內容替換為上傳提示
}