2011-10-31 60 views
23

我沒有看到關於限制上傳的文件數量,到任意數量的plupload API文檔的選項,甚至1Plupload - 限制到只有一個文件

文件失敗?或功能失敗?如果它不存在,我會努力做到這一點,如果有人需要它..

回答

20

這是一個功能失敗。我圍繞jQuery API做了一個包裝,這就是我爲了讓它爲我工作的原因。我的代碼執行一些其他的業務邏輯,但它應該給你足夠的設置開始。

基本上,綁定到FilesAdded事件並在上傳對象(如果文件太多)上調用removeFile。我想我添加了50ms的超時時間,因爲它給我的文件還不存在的問題。

uploader.bind('FilesAdded', function (up, files) { 
    var i = up.files.length, 
     maxCountError = false; 

    plupload.each(files, function (file) { 

     if(uploader.settings.max_file_count && i >= uploader.settings.max_file_count){ 
      maxCountError = true; 
      setTimeout(function(){ up.removeFile(file); }, 50); 
     }else{ 
      // Code to add pending file details, if you want 
     } 

     i++; 
    }); 

    if(maxCountError){ 
     // Too many files uploaded, do something 
    } 

}); 

max_file_count是我添加到pluploader實例,當我創建它的東西。


編輯:其實我不得不做這兩種不同的方式。以上只會允許一個人上傳一定數量的文件(否則會產生錯誤)。

這段代碼的工作原理類似的方式 - 但會刪除現有文件和只能上傳最新:

uploader.bind('FilesAdded', function (up, files) { 
    var fileCount = up.files.length, 
     i = 0, 
     ids = $.map(up.files, function (item) { return item.id; }); 

    for (i = 0; i < fileCount; i++) { 
     uploader.removeFile(uploader.getFile(ids[i])); 
    } 

    // Do something with file details 
}); 
+0

正如我在其他答案的評論中提到的,似乎max_file_count已被添加到jQuery UI小部件中。這仍然不適用於我的應用程序,因爲我想要一個人們可以上傳X個文件的存儲桶(因此需要考慮存儲桶中現有的上傳文件) –

+0

感謝一種無需叉他們的JS;) – JohnO

+2

提出的第二種方式刪除了我的所有文件,s.th.沒有任何文件可以使用。僅爲'i <(fileCount - 1)'運行循環只保留最近添加的文件。 –

6

您可以使用此max_file_count: 5其中5是上傳計數的最大數量。

+4

這不起作用。 'max_file_count'不是plupload中的標準設置 –

+0

我已經添加了當前使用的代碼簽出!是的,它不在網站的示例中。 – coder

+0

否則你可以參考這個問題http://www.plupload.com/punbb/viewtopic.php?pid=5102 – coder

13

基於喬納森·枕的第二個答案,我寫了這個簡單的代碼片段,限制上傳到最後選定的文件:

uploader.bind('FilesAdded', function(up, files) { 
    while (up.files.length > 1) { 
     up.removeFile(up.files[0]); 
    } 
}); 
+1

這似乎是在錯誤的地方(在添加之前),至少在html5前端。這個回調觸發後新文件被添加。這導致限制爲2個文件,而不是一個。 – Joe

+0

(修正了一個零setTimeout以追加到事件循環的末尾)。 – Joe

+0

setTimeOut在哪裏? –

1

允許上傳只有一個文件:

uploader.bind('FilesAdded', function(up, files) { 
    $.each(files, function(i, file) { 
     if(uploader.files.length!=1){uploader.removeFile(file); return;} 
    }); 
}); 

允許一個文件一次選擇:

uploader.bind('FilesAdded', function(up, files) { 
    $.each(files, function(i, file) { 
     if(i){up.removeFile(file); return;} 
    }); 
}); 

允許一次上傳一個文件:

uploader.bind('FilesAdded', function(up, files) { 
    $.each(files, function(i, file) { 
     if(uploader.files.length!=1){uploader.removeFile(file); return;} 
    }); 
}); 
uploader.bind('FileUploaded', function(up, file,response) { 
    up.removeFile(file); 
}); 
3

爲什麼不

if (files.length > 1) uploader.splice(1, files.length - 1); 
2

試試這個。這對我來說可以。

uploader.bind('FilesAdded', function(up, files) { 

if(uploader.files.length > 1) 
{ 
    uploader.removeFile(uploader.files[0]); 
    uploader.refresh();// must refresh for flash runtime 
} 

。 。 。 resto

想法是測試當前上傳對象中的num文件。如果長度大於1,則只需使用方法uploader.removeFile。注意參數是files[0],它不是文件ID,而是完整的文件對象。

({id:"p17bqh1v4dp42gdf1gan75p16tp3", name:"gnome-globe.png", size:48456, loaded:0, percent:0, status:1}) 

此致敬禮!

0

刪除不必要的文件直接上傳之前:

$('uploadfiles').onclick = function() 
      { 
       while (uploader.files.length > 1) 
       { 
         uploader.removeFile(uploader.files[0]); 
       } 

       uploader.start(); 
       return false; 
      }; 
2

現在你可以通過設置multi_selection選項

就這樣

var uploader = new plupload.Uploader({ 
    runtimes : 'html5,flash', 
    browse_button : 'button_id', 
    multi_selection:false, //disable multi-selection 
... 

正式禁用多選doc在這裏:http://www.plupload.com/documentation.php

16

其他方式做到這一點:

$(document).ready(function() { 
    var uploader = new plupload.Uploader({ 
     ... 
     multi_selection: false, 
     .... 
    }); 

問候

+0

顯然不適用於drag'n'drop ...(在當前版本中) –

1

這些答案都不對實際工作。

如果您想使用自定義上傳器,並且一次上傳一個文件,那麼不會自動上傳,並且添加最後一個文件成爲新文件。

uploader.bind('FilesAdded', function(up, files) { 
    // Clear the HTML 
    $('#plupload-files').html(''); 

    // Plup is retarded and does not offer before file added event 
    if (up.files.length > 1) { 
     up.splice(0, up.files.length); 
     up.addFile(files[0]) 
     return; 
    } 

    // $.each(files, function(){.... 
} 

我們拼接整個陣列,因爲PLUP已經將所有的水壩文件到隊列中,如果拼接喜歡接受的答案隊列中,您將實際添加用戶嘗試添加文件一個文件每次,如果他們嘗試單獨添加一個新文件,它會將舊文件保留在文件數組中的位置[012]

然後我們添加他們嘗試添加的文件的第一個文件。這樣,隊列中只有一個文件,並且它始終是他們嘗試添加的最後一組文件中的第一個文件。

即。

拖至plupload 'file1.jpg', 'file2.jpg', 'file3.jpg'

清楚整個大壩隊列,加回 'file1.jpg'

拖至plupload「文件4 .JPG」, 'file5.jpg', 'file6.jpg'

清楚整個大壩隊列,加回 'file4.jpg'

拖至plupload 'file99.jpg'

明確整個大壩隊列,加回'file99.jpg'

如果您只想一次上傳一個文件,這允許您管理自定義插件。如上所述,其他答案只能使用一次,或使用自動開始上傳。

0

嘗試每個解決方案後,我想出了最簡單的 - 這似乎工作。

我正在使用核心API,我有multi_selection設置爲false。然後,在選擇第一個文件(添加)後,將插入到FilesAdded事件中的第二行代碼隱藏瀏覽鏈接。我不認爲這可以用jQuery Widget完成,我也發現除非上傳鏈接覆蓋瀏覽鏈接的位置,否則它仍然活着。

uploader.bind('FilesAdded', function(up, files) { 
//line below hides button 
document.getElementById("browse").style.display = "none"; 

var html = ''; 
plupload.each(files, function(file) { 
html += '<li id="' + file.id + '">' + file.name + ' (' + plupload.formatSize(file.size) + ') <b></b></li>'; 
}); 
document.getElementById('filelist').innerHTML += html; 

});

1

我知道這已經回答了,但我去了一個解決方案是隻使用QueueChanged回調:

QueueChanged: function(uploader) { 
    // Called when queue is changed by adding or removing files 
    //log('[QueueChanged]'); 
    if(uploader.files.length > 1) { 
     uploader.files.splice(0, (parseInt(uploader.files.length) - 1)); 
    } 
} 

有了這個代碼,只保留最後選定的文件(如果他們選擇的理由再次是因爲他們選擇了錯誤的文件)。

2
FilesAdded: function(up, files) { 
     up.files.splice(0,up.files.length-1); 
    }, 
    multi_selection: false, 

使用up.files,只是filesfiles將始終包含我們從文件瀏覽器中選擇的單個項目。 up.files是我們需要縮小到最後選定文件的實際列表。

相關問題