Отображение каждой строки данных во время загрузки файла CSV AJAX

Я использую papaparse, Jquery AJAX, PHP и успешно завершил синтаксический анализ csv, однако я хотел бы отображать данные во время загрузки моего файла CSV.

Вот немного моего кода;

var xhr_file = null;
$('#fileVariants').change(function(e){
  var file = e.target.files[0];
  splitFileName = file['name'].split(".");
  fileType = splitFileName.slice(-1)[0];
  if (fileType != 'csv')
  {
    $('.error-message').html('<br /><div class = "notification is-warning">Only CSV file extension is allowed!</div><br />');
  }
  else
  {
    Papa.parse(file, {
      header: false,
      dynamicTyping: true,
      skipEmptyLines: true,
      complete: function(results, file) {
        file_arr = results.data;
        file_chunk = results.data;
        $('#uploadVariantsBtn').attr('disabled', false);
      }// End complete: function(results, file)
    });
  }

});
$(function(){
    $('#uploadVariants').submit(function(e){
    if ($('#fileVariants').val() == '')
    {
        $('.error-message').html('<div class = "alert alert-danger" role = "alert">File is required!</div><br />');
        return false;
    }

    var method = $(this).attr('method');
    var url = $(this).attr('action');
    var parameters = 'row=' + JSON.stringify(file_chunk);
    xhr_file = $.ajax({
        type : method,
        url : url,
        data : parameters,
        cache : false,
        async: false,
        dataType : "script",
        beforeSend: function(xhr){
            $('#uploadVariantsBtn').attr('disabled', true);
            $('.error-message').html('<br /><div class = "notification is-info has-text-centered"><img width = "110" src = "{{ asset("img/loading.gif") }}" title = "Uploading" /></div>');
            $('.error-message').show();
            if (xhr_file != null)
            {
                xhr_file.abort();
            }
        }
    }).complete(function(data){
        $('#uploadVariantsBtn').attr('disabled', false);
        $('.error-message').html('<div class = "alert alert-success" role = "alert">Product Variants has been updated!</div><br />');
      // $('.show-results').html('<h3>Product Variants have been updated!</h3>');
    }).fail(function(jqXHR, textStatus){
        console.info('Request failed: ' + textStatus);
    });
    return false;
    e.preventDefault();
    });
});

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

Например :

Product Data 1 has been successfully updated!
Product Data 2 has been successfully updated!
Product Data 3 already exist!
Product Data 4 has been successfully updated!
Product Data 5 has been successfully updated!

Есть ли способ сделать это с помощью PHP, Javascript, AJAX?

Вы загружаете данные в цикле или все сразу? Какое у вас значение параметра?

Ayan_84 19.02.2019 07:46
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
1
530
1

Ответы 1

Вы загрузили все свои данные сразу, затем сервер обрабатывает ваши данные, в завершение возвращает результат. На самом деле вам нужен статус длительного процесса для каждой отдельной строки данных процесса. Для этого вам действительно нужен отдельный файл php и вызов ajax. Ваш исходный файл php должен обновить статус в сеансе или базе данных, как показано ниже:

session_start();
$_SESSION['status'] = $status;
session_write_close();

Обратите внимание, что этот фрагмент кода должен находиться внутри цикла обработки данных. Вы должны запустить () и закрыть () этот конкретный сеанс, потому что тот же сеанс не может быть открыт в другом процессе, так как нам нужно получить доступ к этому сеансу из 2-го файла php, который выглядит следующим образом:

ob_start();
session_start();
session_write_close();
$output = array();
$output['status'] = $_SESSION['status'];
echo json_encode($output);

Теперь код на стороне сервера в порядке, вам нужно запросить 2-й php с регулярным интервалом, чтобы получить статус обработки,

var timeout = setInterval('showUpdate()', 1000);
function showUpdate(){
$.get( "2ndPhp.php", function( data ) {
    var returnData = data.status;

    if (returnData.length>0){
        // This is server returned update data, you can show this or convert it to 
       //progressbar
    }

}, "json");
}

Когда ваш основной процесс завершится, вы можете закрыть этот цикл, закрыв этот интервал.

.complete(function(data){
 clearInterval(timeout);
 $('#uploadVariantsBtn').attr('disabled', false);
    $('.error-message').html('<div class = "alert alert-success" role = "alert">Product 
 Variants has been updated!</div><br />');
  // $('.show-results').html('<h3>Product Variants have been updated!</h3>');
}).fail(function(jqXHR, textStatus){
    console.info('Request failed: ' + textStatus);
});

Другие вопросы по теме