閱讀542 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Web直傳解決並發上傳出錯,導致任務停止

Web直傳解決並發上傳出錯,導致任務停止

OSS提供了Web直傳示例的示例

但是上述事例有一個現象
就是當一個文件在上傳過程中,這個時候再選擇一個不符合條件的文件,會導致正在上傳的文件終止。

如此圖

h3. 首先我們來分析一下為什麼會出現這種現象
出現這種現象的原因是:plupload這個控件導致的。
plupload提示了filter

var uploader = new plupload.Uploader({
    runtimes : 'html5,flash,silverlight,html4',
    browse_button : 'selectfiles',
    //multi_selection: false,
    container: document.getElementById('container'),
    flash_swf_url : 'lib/plupload-2.1.2/js/Moxie.swf',
    silverlight_xap_url : 'lib/plupload-2.1.2/js/Moxie.xap',
    url : 'https://oss.aliyuncs.com',

    /*
    注意在這裏添過加濾的功能,會打斷正在上傳的隊列。如果想選擇錯誤的文件不打斷,請在FileFilterd這個函數裏麵添加過濾的邏輯
    */
    filters: {
        mime_types : [ //隻允許上傳圖片和zip,rar文件
        { title : "Image files", extensions : "jpg,gif,png,bmp" },
        { title : "Zip files", extensions : "zip,rar" }
        ],
        //max_file_size : '10mb', //最大隻能上傳10mb的文件
        prevent_duplicates : true //不允許選取重複文件
    },

filters參數指定上傳時指定plupload會對上傳文件的限製。我們來看一下。如果此時再上傳一個非法的條件,會出現什麼情況。要看一下plupload的源碼


plupload.addFileFilter('max_file_size', function(maxSize, file, cb) {
    var undef;

    maxSize = plupload.parseSize(maxSize);

    // Invalid file size
    if (file.size !== undef && maxSize && file.size > maxSize) {
        this.trigger('Error', {
            code : plupload.FILE_SIZE_ERROR,
            message : plupload.translate('File size error.'),
            file : file
        });
        cb(false);
    } else {
        cb(true);
    }
});

這樣就當發現文件大小出錯之後,就出現文件尺寸出錯了。直接跳到出錯了。會跳轉到上層的Error函數。相應的上傳也出現了停止。

解決的方法

這個問題解決思路是自己實現Filter函數,因為用默認的函數,會觸發代碼的出錯處理流程。我們自己采用自己的出錯邏輯。如果出現,隻報錯,不影響正在處理的請求。

plupload提供了很多“勾子函數”,方便對各種情況下進行處理。我們現在增加一個函數:
FileFiltered
這個函數會在文件添加後觸發。函數的邏輯就是,判斷大小是不是符合。如果不符合,提示出錯信息,然後將文件從插件remove

如果成功,就添加文件。

        FileFiltered : function(up, file) {
            /*
            在這裏做過濾文件 上傳的動作,避免解決因為上傳文件有問題下在上傳的隊列出錯。如果要實現這個,需要把filters相關功能禁止。在這裏實現相關的功實現過濾的需求。
            */
            if (file.size < 5 * 1024 * 1024)
            {
                document.getElementById('console').appendChild(document.createTextNode(file.name + " is too small to upload"));
                up.removeFile(file)
            }
            else if (file.size > 100 * 1024 * 1024)
            {
                document.getElementById('console').appendChild(document.createTextNode(file.name + " is too large to upload"));
                up.removeFile(file)
            }
            else
            {
                document.getElementById('ossfile').innerHTML += '<div >' + file.name + ' (' + plupload.formatSize(file.size) + ')<b></b>'
                +'<div ><div  ></div></div>'
                +'</div>';
            }
        },

最後更新:2017-04-27 15:00:48

  上一篇:go 雲棲大會·南京峰會落下帷幕,阿裏雲都幹了些什麼?
  下一篇:go 將技術普惠進行到底,阿裏雲全網爆款最低30元/月