Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

Сбой функции. Я сделал обертку вокруг 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
});

Ответ 2

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

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

Привет

Ответ 3

На основании второго ответа Jonathon Bolster я написал этот более простой фрагмент, чтобы ограничить загрузку в последний выбранный файл:

uploader.bind('FilesAdded', function(up, files) {
    while (up.files.length > 1) {
        up.removeFile(up.files[0]);
    }
});

Ответ 4

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

Ответ 5

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

    if (files.length > 1) uploader.splice(1, files.length - 1);

Ответ 6

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

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

С уважением!

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

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

Ответ 10

Ни один из этих ответов не работает.

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

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'

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

Ответ 11

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

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

Ответ 12

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

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

                uploader.start();
                return false;
            };

Ответ 13

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

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

});