JackShcherbakov
@JackShcherbakov

Проблема с прогрессом загрузки файла на сервер. Как исправить?

Здравствуйте, коллеги! Недавно столкнулся со следующей проблемой:

Раньше всегда использовал событие 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 "Произошла ошибка во время загрузки файла";
}
?>

Заранее выражаю огромную благодарность всем, кто поможет.
  • Вопрос задан
  • 408 просмотров
Пригласить эксперта
Ответы на вопрос 1
@justpusher
Вижу у вас нестыковку с документацией.
В документации: "отправке POST-запросом переменной с именем, равным значению опции session.upload_progress.name. "
У вас же переменная названа ini_get("session.upload_progress.prefix") . ini_get("session.upload_progress.name")
Префикс лишний.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы