Plupload - ограничение только одним файлом - PullRequest
24 голосов
/ 31 октября 2011

Я не вижу опции в документации API plupload по ограничению количества загружаемых файлов до любого числа, даже до 1.

Ошибка документа?или функция не работает?Если этого не будет, я буду работать над тем, чтобы это произошло, если это кому-нибудь понадобится ..

Ответы [ 13 ]

20 голосов
/ 31 октября 2011

Это ошибка функции. Я сделал обертку вокруг jQuery API, и это то, что я сделал, чтобы она работала для меня. Мой код выполняет некоторую другую бизнес-логику, но он должен дать вам достаточно для запуска.

По сути, привязка к событию 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 при его создании.

* * 1010

Редактировать : Я действительно должен был сделать два разных способа для этого. Вышеуказанное позволит только человеку загрузить определенное количество файлов (и в противном случае выдаст ошибку).

Этот фрагмент работает аналогичным образом, но удаляет существующие файлы и загружает только самые последние:

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
});
20 голосов
/ 08 августа 2013

Другой способ сделать это:

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

С уважением

13 голосов
/ 09 июля 2012

Основываясь на втором ответе Джонатона Болстера, я написал этот более простой фрагмент, чтобы ограничить загрузку последним выбранным файлом:

uploader.bind('FilesAdded', function(up, files) {
    while (up.files.length > 1) {
        up.removeFile(up.files[0]);
    }
});
6 голосов
/ 31 октября 2011

Вы можете использовать это max_file_count: 5, где 5 - максимальное количество загрузок.

3 голосов
/ 09 октября 2012

Почему не просто

    if (files.length > 1) uploader.splice(1, files.length - 1);
2 голосов
/ 04 сентября 2015
    FilesAdded: function(up, files) {
        up.files.splice(0,up.files.length-1);
    },
    multi_selection: false,

используйте up.files, просто files.files всегда будет содержать один элемент, который мы выбираем из файлового браузера.up.files - это фактический список, который нам нужно сжать до последнего выбранного файла.

2 голосов
/ 27 июля 2013

теперь вы можете отключить множественный выбор, установив 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

2 голосов
/ 12 ноября 2012

Попробуй это.У меня отлично работает.

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:"p17bqh1v4dp42gdf1gan75p16tp3", name:"gnome-globe.png", size:48456, loaded:0, percent:0, status:1})

С уважением!

1 голос
/ 09 февраля 2015

Я понимаю, что на это ответили, но я решил использовать просто обратный вызов 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));
    }
}

С этим кодом он сохраняет только последний выбранный файл (в случае, если причиной, по которой он снова выбрал, было то, что он выбрал неправильный файл).

1 голос
/ 09 октября 2013

Если вы хотите использовать пользовательский загрузчик и загружать по одному файлу за раз, автоматическая загрузка не выполняется, и последний добавленный файл становится новым файлом.

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 уже добавляет все файлы в очередь, и если вы объедините очередь как принятый ответ, вы фактически добавите один файл каждый раз, когда пользователь пытается добавить файлы, и если они пытаются добавить новый file в единственном числе, он сохранит старый файл в позиции [0] в массиве файлов

Затем мы добавляем первый файл из файлов, которые они пытались добавить. Таким образом, в очереди остается только один файл, и это всегда первый файл в последней группе файлов, которые они пытались добавить.

т.

Перетащите в plupload 'file1.jpg', 'file2.jpg', 'file3.jpg'

очистить всю очередь, добавить обратно 'file1.jpg'

Перетащите в plupload 'file4.jpg', 'file5.jpg', 'file6.jpg'

очистить всю очередь, добавить обратно 'file4.jpg'

Перетащите в plupload 'file99.jpg'

очистить всю очередь, добавить обратно 'file99.jpg'

Это позволяет вам управлять пользовательскими подключениями, если вы хотите загружать только один файл за раз. Как указано, другие ответы работают только один раз или с автоматическим началом загрузки.

...