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

Индивидуальный прогресс в загрузке файла jQuery

Мне было рекомендовано использовать загрузку jQuery файла blueimp.

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

progressall: function (e, data) 
        {
            var progress = parseInt(data.loaded / data.total * 100, 10);
            $('#progress .bar').css('width', progress + '%');
            console.log(progress);
        }

Как сделать то же самое для каждой отдельной загрузки? Как получить элемент DOM (панель прогресса), связанный с этой конкретной загрузкой? Я думал о создании идентификатора по имени файла и размеру файла, но поскольку пользователи могли загружать один и тот же файл дважды (в разные места назначения), это не работает.

Это моя реализация на данный момент:

$('#fileupload').fileupload(
    {
        dataType: 'json',
        done: function (e, data) 
        {
            $.each(data.result.files, function (index, file) 
            {  
                //$('<p/>').text(file.name).appendTo(document.body); 
                //console.log('done with '+file.name);
            });
        },
        progressall: function (e, data) 
        {
            var progress = parseInt(data.loaded / data.total * 100, 10);
            //$('#progress .bar').css('width', progress + '%');
            //console.log(progress);
        }
    }).on('fileuploadadd', function (e, data) 
    {
        $.each(data.files, function (index, file) 
        {

            var node = $('<div class="progressBox"></div>');
            node.append('<div class="progressBoxBack"></div>');
            node.append('<p><span class="progress-filename">'+file.name+' ('+index+')</span><br /><span class="progress-info">0%  0 ko/s  0 sec left</span></p>');
            node.append('<div class="progressBar"><div style="width:23%;"></div></div>');

            node.appendTo($('#progressContainer'));
        });
    });

Может кто-нибудь сказать мне, как или указать мне документацию, которую я не смог найти?

Решение


Чтобы идентифицировать загрузку, вы можете добавить дополнительные параметры к файловому объекту при добавлении. объект файла остается неизменным в событии прогресса (но не в методе done) Итак, на fileuploadadd:
.on('fileuploadadd', function (e, data) 
    {
        $.each(data.files, function (index, file) 
        {
            file.uploadID = 'someidentification' ;
        });
    });

затем, когда вы обрабатываете прогресс:

progress: function (e, data) {
              var progress = parseInt(data.loaded / data.total * 100, 10);

              console.log(data.files[0].uploadID); // returns 'someidentification'

        }
4b9b3361

Ответ 2

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

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

$("#fileupload").fileupload({

        ...

        add: function (e, data) {
            data.context = $('<p/>').text('Uploading...').appendTo(document.body);
            data.submit();
        },

        ...

        progress: function (e, data) {
            var progress = parseInt(data.loaded / data.total * 100, 10);
            data.context.text(progress + '%');
        }
    });

Ответ 3

В php (начиная с версии 5.4 и выше) есть что-то, называемое session upload progress. Он позволяет отслеживать ход загрузки отдельных файлов.

Это может быть довольно громоздким, чтобы запустить его, но вы можете найти несколько примеров того, как объединить его с jquery в запросе XMLHttpRequest/Ajax при поиске в Google.

Также упоминается здесь, в документации по плагину загрузки файла jquery