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



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы загрузили все свои данные сразу, затем сервер обрабатывает ваши данные, в завершение возвращает результат. На самом деле вам нужен статус длительного процесса для каждой отдельной строки данных процесса. Для этого вам действительно нужен отдельный файл 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);
});
Вы загружаете данные в цикле или все сразу? Какое у вас значение параметра?