我没有在plupload API文档中看到限制上传文件数量的选项,任何数字,甚至是1。
Doc失败了吗?或功能失败?如果它不存在,我会努力让这种情况发生,如果有人需要它..
答案 0 :(得分: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
});
答案 1 :(得分:18)
其他方法:
$(document).ready(function () {
var uploader = new plupload.Uploader({
...
multi_selection: false,
....
});
此致
答案 2 :(得分:13)
基于Jonathon Bolster的第二个答案,我写了这个更简单的片段来限制上传到最后选择的文件:
uploader.bind('FilesAdded', function(up, files) {
while (up.files.length > 1) {
up.removeFile(up.files[0]);
}
});
答案 3 :(得分:6)
您可以使用此max_file_count: 5
,其中5是最大上传次数。
答案 4 :(得分:3)
为什么不
if (files.length > 1) uploader.splice(1, files.length - 1);
答案 5 :(得分: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文件。如果length大于1,则只需使用方法uploader.removeFile
。请注意,参数是files[0]
,它不是文件ID,而是完整的文件对象。
({id:"p17bqh1v4dp42gdf1gan75p16tp3", name:"gnome-globe.png", size:48456, loaded:0, percent:0, status:1})
祝你好运!
答案 6 :(得分:2)
现在您可以通过将 multi_selection 选项设置为 false
来禁用多项选择就像这样
var uploader = new plupload.Uploader({
runtimes : 'html5,flash',
browse_button : 'button_id',
multi_selection:false, //disable multi-selection
...
答案 7 :(得分:2)
FilesAdded: function(up, files) {
up.files.splice(0,up.files.length-1);
},
multi_selection: false,
使用up.files
,只需files
。 files
将始终包含我们从文件浏览器中选择的单个项目。 up.files
是我们需要缩小到上一个选定文件的实际列表。
答案 8 :(得分: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);
});
答案 9 :(得分:1)
如果您想使用自定义上传器,并且一次上传一个文件,没有自动上传并且添加了最后一个文件,则使用此文件。
uploader.bind('FilesAdded', function(up, files) {
// Clear the HTML
$('#plupload-files').html('');
// Plup 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已经将所有文件添加到队列中,如果你像接受的答案一样拼接队列,那么每次用户尝试添加文件时,你实际上会添加一个文件,如果他们尝试添加新的单独文件它会将旧文件保存在文件数组中的pos [0],
然后我们添加他们尝试添加的文件的第一个文件。这样,队列中只有一个文件,它始终是他们尝试添加的最后一组文件中的第一个文件。
即
拖入plupload'file1.jpg','file2.jpg','file3.jpg'
清除整个队列,加回'file1.jpg'
拖入plupload'file4.jpg','file5.jpg','file6.jpg'
清除整个队列,加回'file4.jpg'
拖入plupload'file99.jpg'
清除整个队列,加回'file99.jpg'
如果您只想一次上传一个文件,则可以管理自定义选项。如上所述,其他答案只能使用一次,或者自动启动上传。
答案 10 :(得分: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));
}
}
使用此代码,它只保留最后选择的文件(如果他们再次选择的原因是因为他们选择了错误的文件)。
答案 11 :(得分:0)
在上传之前直接删除不必要的文件:
$('uploadfiles').onclick = function()
{
while (uploader.files.length > 1)
{
uploader.removeFile(uploader.files[0]);
}
uploader.start();
return false;
};
答案 12 :(得分:0)
在尝试了每个解决方案后,我想出了最简单的解决方案 - 这似乎有效。
我正在使用核心api,我将multi_selection设置为false。然后,在选择(添加)第一个文件后,我插入FilesAdded事件的第二行代码隐藏了浏览链接。我不认为这可以用jquery小部件来完成,我也发现除非上传链接覆盖了浏览链接的位置,否则它仍然存在。
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;
});