Я не вижу возможности в документах API plupload по ограничению количества загруженных файлов, любому числу, даже 1.
Ошибка Doc? или функция не работает? Если он не существует, я буду работать над тем, чтобы это произошло, если кому-то это нужно.
Я не вижу возможности в документах API plupload по ограничению количества загруженных файлов, любому числу, даже 1.
Ошибка Doc? или функция не работает? Если он не существует, я буду работать над тем, чтобы это произошло, если кому-то это нужно.
Сбой функции. Я сделал обертку вокруг API jQuery, и это то, что я сделал, чтобы заставить его работать для меня. Мой код выполняет некоторые другие бизнес-логики, но он должен дать вам достаточно, чтобы начать работу.
В принципе, привязывайтесь к событию FilesAdded
и вызывайте removeFile
в объект uploader (если файлов слишком много). Я думаю, что я добавил 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
});
Другой способ сделать это:
$(document).ready(function () {
var uploader = new plupload.Uploader({
...
multi_selection: false,
....
});
Привет
На основании второго ответа Jonathon Bolster я написал этот более простой фрагмент, чтобы ограничить загрузку в последний выбранный файл:
uploader.bind('FilesAdded', function(up, files) {
while (up.files.length > 1) {
up.removeFile(up.files[0]);
}
});
Вы можете использовать этот max_file_count: 5
, где 5 - максимальное количество выгрузок.
Почему не просто
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
}
., Ресто
Идея состоит в том, чтобы проверять число файлов в текущем объекте uploader. Если длина больше 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);
});
Ни один из этих ответов не работает.
Если вы хотите использовать пользовательский загрузчик и загружать по одному файлу за раз, автоматическая загрузка и добавление последнего файла в новый файл не используются.
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 уже добавляет все файлы дам в очередь, и если вы сплайсируете очередь, как принятый ответ, вы фактически добавите один файл каждый раз, когда пользователь попытается добавить файлы, и если они попытаются добавить новый файл в отдельности сохранит старый файл в 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'
Это позволяет вам управлять настраиваемыми плугами, если вы хотите только загрузить один файл за раз. Как указано, остальные ответы работают только один раз или с загрузкой с автоматическим стартом.
Я понимаю, что это ответ, но решение, с которым я пошел, состояло в том, чтобы просто использовать обратный вызов 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));
}
}
С помощью этого кода он сохраняет только последний выбранный файл (в случае, если причина, по которой они были выбраны, была связана с тем, что они выбрали неверный файл).
Удалите ненужные файлы непосредственно перед загрузкой:
$('uploadfiles').onclick = function()
{
while (uploader.files.length > 1)
{
uploader.removeFile(uploader.files[0]);
}
uploader.start();
return false;
};
Пробовав каждое из решений, я придумал простейший из них - который, похоже, работает.
Я использую core 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;
});