Я не вижу в документах API plupload возможности ограничить количество загружаемых файлов любым числом, даже 1.
Док провалился? или Функция не работает? Если его не существует, я буду работать над тем, чтобы это произошло, если кому-то это нужно.
Я не вижу в документах API plupload возможности ограничить количество загружаемых файлов любым числом, даже 1.
Док провалился? или Функция не работает? Если его не существует, я буду работать над тем, чтобы это произошло, если кому-то это нужно.
Это ошибка функции. Я сделал обертку вокруг API jQuery, и вот что я сделал, чтобы заставить его работать на меня. В моем коде реализована другая бизнес-логика, но этого должно быть достаточно, чтобы начать работу.
По сути, привяжите к событию FilesAdded
и вызовите removeFile
для объекта загрузчика (если файлов слишком много). Я думаю, что добавил тайм-аут 50 мс, потому что это вызывало у меня проблемы с еще не существующим файлом.
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
});
max_file_count
был добавлен в виджет пользовательского интерфейса jQuery. Это все еще не относится к моему приложению, так как я хотел корзину, в которую люди могли бы загружать X файлов (поэтому нужно было учитывать существующие загруженные файлы в корзину)
- person Jonathon Bolster; 01.11.2011
i < (fileCount - 1)
сохраняет только последний добавленный файл.
- person Adrian Lange; 12.11.2014
Другой способ сделать это:
$(document).ready(function () {
var uploader = new plupload.Uploader({
...
multi_selection: false,
....
});
С уважением
Основываясь на втором ответе Джонатона Болстера, я написал этот более простой фрагмент, чтобы ограничить загрузку последним выбранным файлом:
uploader.bind('FilesAdded', function(up, files) {
while (up.files.length > 1) {
up.removeFile(up.files[0]);
}
});
Вы можете использовать это max_file_count: 5
, где 5 — максимальное количество загрузок.
max_file_count
не является стандартной настройкой в plupload
- person Jonathon Bolster; 01.11.2011
max_file_count
реализован (github.com/ moxiecode/plupload/blob/master/examples/jquery/). Кроме того, обратите внимание, что добавление кода или чего-либо еще должно быть выполнено путем редактирования вашего ответа (если он не совсем другой)
- person Jonathon Bolster; 01.11.2011
Почему бы просто не
if (files.length > 1) uploader.splice(1, files.length - 1);
Попробуй это. Он отлично работает для меня.
uploader.bind('FilesAdded', function(up, files) {
if(uploader.files.length > 1)
{
uploader.removeFile(uploader.files[0]);
uploader.refresh();// must refresh for flash runtime
}
. . . ресто
Идея состоит в том, чтобы проверить количество файлов в текущем объекте загрузчика. Если длина больше 1, то просто используйте метод uploader.removeFile
. Обратите внимание, что аргументом является files[0]
, который является не идентификатором файла, а полным файловым объектом.
({id:"p17bqh1v4dp42gdf1gan75p16tp3", name:"gnome-globe.png", size:48456, loaded:0, percent:0, status:1})
С наилучшими пожеланиями!
теперь вы можете отключить множественный выбор, установив для параметра multi_selection значение false.
именно так
var uploader = new plupload.Uploader({
runtimes : 'html5,flash',
browse_button : 'button_id',
multi_selection:false, //disable multi-selection
...
официальный документ находится здесь: http://www.plupload.com/documentation.php
FilesAdded: function(up, files) {
up.files.splice(0,up.files.length-1);
},
multi_selection: false,
используйте up.files
, просто files
. files
всегда будет содержать один элемент, который мы выбираем в файловом браузере. up.files
— это фактический список, который нам нужно сжать до последнего выбранного файла.
Разрешить загрузку только одного файла:
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);
});
Я понимаю, что на это был дан ответ, но решение, которое я выбрал, состояло в том, чтобы просто использовать обратный вызов 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));
}
}
С этим кодом он сохраняет только последний выбранный файл (на случай, если причина повторного выбора заключалась в том, что они выбрали неправильный файл).
Если вы хотите использовать пользовательский загрузчик и загружать по одному файлу за раз, без автоматической загрузки и чтобы последний добавленный файл стал новым файлом, используйте это.
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] в массиве файлов,
Затем мы добавляем первый файл из файлов, которые пытались добавить. Таким образом, в очереди всегда будет только один файл, и это всегда первый файл в последней группе файлов, которые они пытались добавить.
ie.
Перетащите в plupload 'file1.jpg', 'file2.jpg', 'file3.jpg'
очистить всю очередь, добавить обратно 'file1.jpg'
Перетащите в plupload 'file4.jpg', 'file5.jpg', 'file6.jpg'
очистить всю очередь, добавить обратно 'file4.jpg'
Перетащите в plupload 'file99.jpg'
очистить всю очередь, добавить обратно 'file99.jpg'
Это позволяет вам управлять пользовательскими плагинами, если вы хотите загружать только один файл за раз. Как уже говорилось, другие ответы работают только один раз или с автоматической загрузкой.
Удалите ненужные файлы непосредственно перед загрузкой:
$('uploadfiles').onclick = function()
{
while (uploader.files.length > 1)
{
uploader.removeFile(uploader.files[0]);
}
uploader.start();
return false;
};
Попробовав каждое из решений, я нашел самое простое из всех, которое, кажется, работает.
Я использую основной 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;
});