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

avatar
Dave Coventry
8 августа 2021 в 20:52
60
0
0

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

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

Я инициализирую XMLHttpRequest(), используя let xhr = new XMLHttpRequest();.

Затем я открываю соединение, используя xhr.open("POST", "index.php");.

Затем я определяю процедуру выполнения, используя xhr.upload.addEventListener("progress", ({loaded, total}) =>{}, которая содержит вывод для индикатора выполнения.

Форма html инкапсулируется с помощью let data = new FormData(form); и затем передается на сервер с использованием xhr.send(data);.

Все это описано в руководстве.

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

Я пытался

  xhr.onreadystatechange = function(){
    if(xhr.readyState == 4 && xhr.status == 200){
      console.log(xhr.response);
    }
  }

Но это ничего не выводит.

Кто-нибудь может предложить способ достижения этого?

Код php такой:

$index_number=0;
$output="";
if ($_FILES['file']['error'])){
  die('Cannot process file.');
}
$file_name =  $_FILES['file']['name'];
$file_dir = "files/".$_POST['dbname']."/";
$tmp_name = $_FILES['file']['tmp_name'];
$query="INSERT INTO drawings (name)VALUES('".$file_name."');";
$mysqli = new mysqli('localhost', 'dwgman', 'fM6#[psL!dwD8XV+G1', $_POST['dbname']);
if ($result = $mysqli->query($query)) {
  $index_number=$mysqli->insert_id;
}
if(!file_exists($file_dir)){
  mkdir($file_dir,0744);
}
move_uploaded_file($tmp_name,$file_dir.$index_number.".sat");
$command="/var/www/html/dfile/stored "."/var/www/html/dfile/".$file_dir.$index_number.".sat ".$_POST['dbname']." ".$index_number;
passthru($command); 
Источник
Bravo
8 августа 2021 в 23:23
0

какой выход? без кода PHP мы не можем сказать, какой вывод вы ожидаете увидеть. xhr.response или xhr.responseText являются вероятными кандидатами на чтение ответа сервера.

Bravo
8 августа 2021 в 23:28
0

однако PHP в этом руководстве не отправляет никакого ответа

Dave Coventry
9 августа 2021 в 06:16
0

Я отредактировал пост, включив PHP, хотя я не уверен, что он что-то добавляет. По сути, у меня есть программа, которая анализирует файл и заполняет базу данных, сообщая о своем прогрессе по мере продвижения: 10...20...30... и т. д. Я хотел бы зафиксировать этот вывод, чтобы проинформировать пользователя.

Bravo
9 августа 2021 в 06:17
0

где этот код, о котором вы говорите? Я не вижу ничего, что приводит к прогрессу

Dave Coventry
9 августа 2021 в 18:41
0

Программа представляет собой скомпилированную программу на языке C, которую я написал и которая использует стороннюю библиотеку для разбора загруженного файла и сохранения элементов в базе данных. Программа использует printf для печати чисел: на десятой части файла программа напечатает «10», на середине файла программа напечатает «50» и так далее до 100 процентов. Мне нужно получить доступ к этому выводу, чтобы я мог показать пользователю прогресс.

Dave Coventry
17 августа 2021 в 06:52
0

Спасибо всем, кто посмотрел это. Я чувствую себя полным идиотом. Код работает, но сообщения, которые я получал, выводились в stderr. Я мог видеть вывод, когда запускал программу из командной строки, но мои вызовы ajax генерировали ошибки, которые не отображались. Извинения.

Ответы (0)