Здравствуйте, коллеги! Недавно столкнулся со следующей проблемой:
Раньше всегда использовал событие onreadystatechange у XMLHttpRequest для индикации прогресса, но сейчас хочу сделать то же, но с использованием сессии. Но почему-то массив $_SESSION - который по идее и должен содержать инфу о прогрессе загрузки - почему-то пустой.
Вот настройки конфигурации:
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"
Вот HTML-форма для загрузи PNG файла:
<!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>
По поводу последнего инпута, вот цитата из
документации:
Прогресс закачки будет доступен в суперглобальной переменной $_SESSION во время выполнения загрузки, а также при отправке POST-запросом переменной с именем, равным значению опции session.upload_progress.name. Как только PHP обнаружит такой POST-запрос, он создаст массив в $_SESSION, ключом которого будет конкатенация значений опций session.upload_progress.prefix и session.upload_progress.name.
А вот и сам PHP:
<?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 "Произошла ошибка во время загрузки файла";
}
?>
Заранее выражаю огромную благодарность всем, кто поможет.