J
J
JackShcherbakov2018-03-21 14:37:40
PHP
JackShcherbakov, 2018-03-21 14:37:40

Problem with the progress of uploading a file to the server. How to fix?

Hello colleagues! I recently encountered the following problem:
I used to always use the onreadystatechange event of XMLHttpRequest to indicate progress, but now I want to do the same, but using the session. But for some reason the $_SESSION array - which, in theory, should contain information about the download progress - is empty for some reason.
Here are the configuration settings:

session.upload_progress.enabled = On
session.upload_progress.cleanup = On
session.upload_progress.prefix = "upload_progress_"
session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
session.upload_progress.freq =  "10K"

Here is the HTML form for uploading a PNG file:
<!DOCTYPE html>
<html>

<head>
<meta content="text/html; charset=utf-8" http-equiv="Content-Type">
<title>Загрузка файлов на сервер</title>
</head>

<body>
<form action="upload.php" enctype="multipart/form-data" method="POST">
  <fieldset>
    <legend>Загрузка файла</legend>
      <input type="hidden" name="MAX_FILE_SIZE" value="1000000"
    <label>Выбрать картинку<input type="file" name="picture"></label><br>
    <label>Загрузить<input type="submit"></label>
    </fieldset>
    <input type="hidden" name="<?php echo  ini_get("session.upload_progress.prefix") . ini_get("session.upload_progress.name"); ?>" value="123" />

</form>
</body>

</html>

Regarding the last input, here is a quote from the documentation :

The upload progress will be available in the $_SESSION superglobal variable during the upload, as well as when sending a POST request variable with a name equal to the value of the session.upload_progress.name option. Once PHP detects such a POST request, it will create an array in $_SESSION whose key will be the concatenation of the session.upload_progress.prefix and session.upload_progress.name options.

And here is PHP itself:
<?php
session_start();
if($_FILES["picture"]["error"]){
  echo "Ошибка №" . $_FILES["picture"]["error"] . " - ";
  switch ($_FILES["picture"]["error"]){
  case 0: echo "Ошибок не возникло, файл был успешно загружен на сервер.";
        break;
  case 1: echo "Размер принятого файла превысил максимально допустимый размер, который задан ди:рективой upload_max_filesize конфигурационного файла php.ini.";
        break;
  case 2: echo "Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме.";
        break;
  case 3: echo "Загружаемый файл был получен только частично.";
        break;
  case 4: echo "Файл не был загружен.";
        break;
  case 6: echo "Отсутствует временная папка. Добавлено в PHP 5.0.3.";
        break;
  case 7: echo "Не удалось записать файл на диск. Добавлено в PHP 5.1.0.";
        break;
  case 8: echo "PHP-расширение остановило загрузку файла. PHP не предоставляет способа определить, какое расширение остановило загрузку файла; в этом может помочь просмотр списка загруженных расширений с помощью phpinfo(). Добавлено в PHP 5.2.0.";
  }
  exit;
}
if(mime_content_type($_FILES["picture"]["tmp_name"]) != "image/png"){
  echo "Ошибка. Файл не является изображением PNG";
  exit;
}
$destination = __DIR__ . "/uploads/" . basename($_FILES["picture"]["name"]);
if(move_uploaded_file($_FILES["picture"]["tmp_name"], $destination)){
  echo "Файл был успешно загружен на сервер";
  echo "Вы загрузили следующее изображение: <br>";
  echo "<img src='uploads/" . $_FILES["picture"]["name"] . "'><br>";
  echo "Информация о загруженном файле:<br>";

 //ВОТ ТУТ НЕПОНЯТКА. Почему этот массив пуст?

  var_dump($_SESSION);


}else{
  echo "Произошла ошибка во время загрузки файла";
}
?>

I would like to thank everyone in advance who will help.

Answer the question

In order to leave comments, you need to log in

1 answer(s)
J
justpusher, 2018-03-29
@justpusher

I see a discrepancy with your documentation.
In the documentation: "sending a POST request to a variable with a name equal to the value of the session.upload_progress.name option."
Your variable is named ini_get("session.upload_progress.prefix") . ini_get("session.upload_progress.name")
The prefix is ​​redundant.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question