SWFUpload上傳文件

(複製的別人的  研究了一天了 保存下。。。)

SWFUpload的原理:
利用Flash選擇文件後上傳,通過Flash和JS交互,對整個過程進行控制——包括頁面的DOM操作之類的,都可以通過JS來進行控制。
說白了,就是用Flash上傳,JS操作DOM

使用時首先必須要初始化
var swfObject,paramsObject;
window.onload = function(){ swfObject = new SWFUpload(paramsObject); }
這個初始化做了很多事情,包括對SWFUpload生成的實例的參數等等。
所有的參數設置都在那個paramsObject參數中。 paramsObject其實是一個JSON格式的對象,該對象有一些屬性。
upload_url:   文件上傳的處理程序,就是說,你要在這個文件對上傳這個動作進行定義,比如文件保存、重命名之類的,如果這個沒有具體動作的話,文件不會在服務器上有任何蹤跡(根本就不是FILE格式傳遞的。)
flash_url : 上傳的Flash,用SWFUpload默認的就可以。具體位置具體解決。
file_post_name : 這個和upload_url有關係。這個設置後,在upload_url路徑中,就可以用Request(“Filedata”)來獲取上傳的文件相關信息了。
file_types : “*.jpg;*.gif”, //允許上傳文件類型
file_types_description: 選取文件時的描述
file_size_limit : “1024″, //可以上傳文件的最大尺寸,單位可以是B、KB、MB、GB,如果沒有單位,則默認是KB
file_upload_limit :最大可以上傳文件數量 0爲不限制
file_queue_limit :上傳隊列等待文件數的最大值
debug : false //是否調試模式
prevent_swf_caching : false,//在相關的swf文件增加隨機參數以避免Flash被緩存(建議打開,Flash被緩存已經導致太多問題了)

button_placeholder_id : “element_id”, //Flash選擇文件按鈕的id,相應的DOM的ID元素會被替換成Flash上傳按鈕
button_image_url : //Flash上傳按鈕的圖片
button_width:
button_height:
button_text :
button_text_style:
button_text_left_padding:
button_text_top_padding:
button_action : SWFUpload.BUTTON_ACTION.SELECT_FILES 可以多選文件/ SWFUplaod.BUTTON_ACTION.SELECT_FILE 不可以多選文件
button_disable :false//按鈕是否不可用
button_cursor : SWFUpload.BUTTON_CURSOR.HAND //鼠標劃過Flash按鈕顯示的光標狀態
button_window_mode : SWFUpload.WINDOW_MODE.TRANSPARENT

swfupload_loaded_handler : swfupload_loaded_function, //Flash按鈕被加載好的時候執行的操作,可以爲空。
file_dialog_start_handler : file_dialog_start_function, //打開文件選擇選擇窗口時觸發的事件,默認方法fileDialogStart,可根據需要重載方法
file_queued_handler : file_queued_function, //文件成功選擇後觸發的事件,默認方法fileQueued(fileObject),可根據需要重載方法
file_queue_error_handler : file_queue_error_function, //文件選擇失敗後觸發事件(類型不對、大小不對等等),默認方法 fileQueueError(fileObject,errorcode,message),可根據需要重載方法
file_dialog_complete_handler : file_dialog_complete_function,//文件選擇窗口關閉時觸發事件,默認方法 fileDialogComplete(number of selected files,number of queued files),可根據需要重載方法

upload_start_handler : upload_start_function, //上傳開始時觸發事件,默認方法uploadStart(fileObject),可根據需要重載方法
upload_progress_handler : upload_progress_function, //文件上傳過程中觸發事件,默認方法uploadProgress(fileObject,bytes complete,bytes all),可根據需要重載方法
upload_error_handler : upload_error_function, //文件傳輸過程中出錯觸發事件,默認方法uploadError(fileObject,error code,message),可根據需要重載方法
upload_success_handler : upload_success_function,//文件傳輸完成(僅僅是發送,不管服務器是否操作),默認方法 uploadSuccess(fileObject,serverdata),可根據需要重載方法。其中serverdata表示服務器 upload_url返回的信息(Window服務器需要返回一個非空值,否則success和complete都不執行)
upload_complete_handler : upload_complete_function, //一個文件上傳週期完成時觸發(不管是否上傳成功還是失敗,都會觸發) debug_handler : debug_function, //調試模式打開的時候,在頁面的textArea中添加debug信息供調用。默認SWFUpload已經定義了debug(message)方法調 用,如有需要複寫覆蓋掉。
custom_settings : { custom_setting_1 : “custom_setting_value_1″, custom_setting_2 : “custom_setting_value_2″, custom_setting_n : “custom_setting_value_n”, } }//定義的變量主要是供各個handler函數使用。
PS:參數中的各個函數,都算是SWFUpload這個類的的成員函數。調用 SWFUpload的其他函數就可以直接用this.xxx()來調用。如果不是上述參數中的函數,需要調用SWFUpload的函數,比如上傳開始的 startUpload()。如果你是在fileQueued函數中要上傳,那麼只需要執行this.startUpload()就可以了。如果你想在點 擊Submit的時候進行上傳,那麼這個時候週期就不在SWFUpload執行中了(不屬於上述任何一個handler),這時你要想上傳就應該是指明某 個SWFUpload的實例,比如本篇應該是swfObject.startUpload();(具體理解成類就好了,一個是在類的內部調用,一種是類的 外部調用)

upload_success_handler:uploadSuccess SWFUpload的提交過程與表單無關,所以我們需要手動設置SWFUpload的對象進行startUpload();——這個方法是已經初始化的 SWFUpload對象具有的方法。操作纔行。通常情況下,我們可以在表單的submit按鈕上面添加一個onclick操作或者對錶單增加一個 onsubmit操作,在執行相應的操作之前,先將SWFUpload對象中的文件先上傳上去,在上傳成功後,也就是 upload_success_handler被觸發的時候,對頁面的DOM進行操作,比對部分hidden元素進行賦值(不賦值,如何知道相應的上傳結 果等亂七八糟的事情),然後表單提交的時候就直接帶着這些hidden值就傳過去了。 在整個過程中,上傳和表單提交是兩個完全不同的過程執行的操作(如果你把startUpload方法綁定到表單提交過程中的話,感覺是一個過程,但是本質 上還是兩個過程——文件上傳(包括對錶單的部分hidden域進行賦值)和表單提交兩個過程。) 所以我有個想法,乾脆在file_queued_handler過程中就直接上傳,也就是觸發startUpload()方法,並且在 upload_success_handler事件中對隱藏域(hidden)賦值,一方面省去了最後一次性提交的麻煩,另一方面也較少了系統響應時間 (表單還是有一些時間填寫的哦)。

 

實例代碼:

function initSwfus(){
    $(".file-li").each(function(i, v){
        var li = $(v);
        swfUs[i] = new SWFUpload($.extend(true, {}, swufConfig, {
            // Backend settings
            upload_url: li.find(".file-save-a").attr("href"),
            file_post_name: "file",

            file_types : li.find(".type-list").val(),
            file_types_description : fileDesc,
            file_dialog_start_handler: function(){this.cancelUpload();li.find(".file-err").text('').hide();},
            file_dialog_complete_handler: function(){this.startUpload();},
            upload_start_handler: function(){
                loadingMsg();
                li.find(".img img").attr('src', loadImgUrl);
            },
            upload_success_handler : function(file, serverData){
                var wf = eval("(" + serverData + ")");
                if (wf['class'] == 'File'){
                    uploadSuccess(li, wf);
                    successMsg();
                    rightBatch();
                    $("#need_flush").val('true');
                } else {
                    successMsg();
                    li.find(".img img").attr('src', emptyImgUrl);
                    li.find(".file-err").text(wf.wFile.width + '*' + wf.wFile.height + noMatchMsg).show();
                }
            },
            upload_error_handler:function(file, errCode, msg){
                errorMsg();
                li.find(".img img").attr('src', emptyImgUrl);
            },
            // Button Settings
            button_image_url:null,
            button_placeholder_id :li.find(".file-save-span").attr('id'),
            button_width: 40,
            button_height: 18,
            button_text : '<span class="button">' + li.find(".file-save-a").text() + '</span>',
            button_text_style: '.button {color:#0E8BB0;font-size:12px;font-family:Verdana,Arial,sans-serif;font-size-adjust:none;font-style:normal;}',
            button_text_top_padding: 0,
            button_text_left_padding: 0,
            //button_window_mode: SWFUpload.WINDOW_MODE.TRANSPARENT,
            button_cursor: SWFUpload.CURSOR.HAND
        }));
    });

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章