Строгий стандарт erro в загрузке файлов

Я написал PHP-скрипт для загрузки файлов. Но когда я нажимаю кнопку отправки, появляется сообщение об ошибке:

Strict Standards: Only variables should be passed by reference in H:\xampp\htdocs\phpTest\upload_file.php on line 4. 

строка 4 – это $ extension = end (explode (".", $ _FILES ["file"] ["name"]));

upload_file.php:

 <?php $allowedExts = array("jpg", "jpeg", "gif", "png"); $extension = end(explode(".", $_FILES["file"]["name"])); if ((($_FILES["file"]["type"] == "image/gif") || ($_FILES["file"]["type"] == "image/jpeg") || ($_FILES["file"]["type"] == "image/pjpeg")) && ($_FILES["file"]["size"] < 20000) && in_array($extension, $allowedExts)) { if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { $target_Path = "images/"; $target_Path = $target_Path.basename( $_FILES['file']['name'] ); move_uploaded_file( $_FILES['file']['tmp_name'], $target_Path ); echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["file"]["type"] . "<br />"; echo "Size: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "Stored in: " . $_FILES["file"]["tmp_name"]; echo $target_Path; } } else { echo "Invalid file"; } ?> 

Вы пытаетесь сделать end() в массиве, который существует только в контексте вызова этой функции. Как только эта строка кода будет завершена, массив перестанет существовать. Попробуйте это вместо этого:

 $bits = explode(".", $_FILES["file"]["name"]) $extension = end($bits); 

Это, как говорится, это плохой способ сделать извлечение расширения файла, а также очень небезопасным. Имя файла, представленное в массиве $ _FILES, является именем файла, данным удаленным клиентом. Нестандартно подделывать это имя файла, позволяя пользователю загружать «nastyvirus.exe», но отправлять «cutekittens.jpg» в качестве имени файла.

Никогда не доверяйте пользовательским данным, особенно для загрузки файлов. Использовать определение типа MIME на стороне сервера через fileinfo

Согласно руководству, http://www.php.net/end

Этот массив передается по ссылке, потому что он модифицируется функцией. Это означает, что вы должны передать ему реальную переменную, а не функцию, возвращающую массив, потому что только фактические переменные могут передаваться по ссылке.

Поэтому вы должны назначить результат разрыва в переменной, а затем end () на этом

Если есть проблема только из-за функции конца, вы можете сделать следующее, чтобы получить расширение файла:

 $path_parts = pathinfo($fullPath); $extension = strtolower($path_parts["extension"]);