Plupload - ограничиться только одним файлом

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

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


person JohnO    schedule 31.10.2011    source источник


Ответы (13)


Это ошибка функции. Я сделал обертку вокруг 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
});
person Jonathon Bolster    schedule 31.10.2011
comment
Как я упоминал в своем комментарии к другому ответу, кажется, что max_file_count был добавлен в виджет пользовательского интерфейса jQuery. Это все еще не относится к моему приложению, так как я хотел корзину, в которую люди могли бы загружать X файлов (поэтому нужно было учитывать существующие загруженные файлы в корзину) - person Jonathon Bolster; 01.11.2011
comment
спасибо за способ, который будет работать без необходимости разветвления их JS;) - person JohnO; 01.11.2011
comment
Второй представленный способ удалил все мои файлы, s.th. не осталось файлов для работы. Запуск цикла только для i < (fileCount - 1) сохраняет только последний добавленный файл. - person Adrian Lange; 12.11.2014

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

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

С уважением

person octavioccl    schedule 08.08.2013
comment
Видимо не работает для drag'n'drop... (в текущей версии) - person Mario Cesar; 28.11.2013

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

uploader.bind('FilesAdded', function(up, files) {
    while (up.files.length > 1) {
        up.removeFile(up.files[0]);
    }
});
person JoaoPSF    schedule 09.07.2012
comment
Кажется, это срабатывает не в том месте (до того, как оно будет добавлено), по крайней мере, для внешнего интерфейса html5. Новый файл добавляется после запуска этого обратного вызова. Это приводит к ограничению 2 файлами, а не одним. - person Joe; 30.11.2012
comment
(Исправлено с нулевым setTimeout для добавления в конец цикла событий.) - person Joe; 30.11.2012
comment
Это также не работает с загрузкой перетаскиванием, так как вы можете добавить более двух файлов за раз. - person devicenull; 20.12.2012
comment
Это должно быть up.files.length›0, так как это срабатывает до фактического добавления файла в очередь. т.е. в первый раз длина будет равна 0, во второй раз она будет равна единице. Вы хотите удалить его уже тогда - person Murdock; 23.04.2014

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

person coder    schedule 31.10.2011
comment
Это не работает. max_file_count не является стандартной настройкой в ​​plupload - person Jonathon Bolster; 01.11.2011
comment
Я добавил свой текущий код проверки использования! И да, его нет в примерах на сайте. - person coder; 01.11.2011
comment
Или вы можете сослаться на этот вопрос plupload.com/punbb/viewtopic.php?pid =5102 - person coder; 01.11.2011
comment
Ах ха - я исправлен. Похоже, виджет пользовательского интерфейса jQuery был max_file_count реализован (github.com/ moxiecode/plupload/blob/master/examples/jquery/). Кроме того, обратите внимание, что добавление кода или чего-либо еще должно быть выполнено путем редактирования вашего ответа (если он не совсем другой) - person Jonathon Bolster; 01.11.2011
comment
Спасибо, что указали на меня. И да, я реализовал виджет jquery UI. - person coder; 01.11.2011
comment
Если вы ограничиваетесь одним файлом, вам также может понадобиться: 'multi_selection: false, // Отключить выбор нескольких файлов в диалоговом окне "Открыть файл" - person RedYeti; 18.10.2012

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

    if (files.length > 1) uploader.splice(1, files.length - 1);
person 8bitjoey    schedule 08.10.2012

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

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})

С наилучшими пожеланиями!

person Vladimir Djuricic    schedule 12.11.2012

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

person chuck911    schedule 27.07.2013

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

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

person Sheikh Abdul Wahid    schedule 04.09.2015

Разрешить загрузку только одного файла:

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);
});
person Community    schedule 17.07.2012

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

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

person James    schedule 09.02.2015

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

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'

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

person Simon Ilett    schedule 09.10.2013

Удалите ненужные файлы непосредственно перед загрузкой:

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

                uploader.start();
                return false;
            };
person Mikhail Shiryaev    schedule 04.04.2013

Попробовав каждое из решений, я нашел самое простое из всех, которое, кажется, работает.

Я использую основной 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;

});

person JaneH    schedule 21.01.2015