LINUX.ORG.RU

[php][file upload] Не работает move_uploaded_file()

 


0

0

Всем привет!

Нужно реализовать подгрузку картинок на сервак. Честно слизал пример где-то из Интернета. Работает все, кроме move_uploaded_file() . Может каталог неправильно задаю? Может прав (каких-то) нет? Как выяснить в чем причина?

Код приведен ниже. Выдает 'Error: moving file failed.'.

Помогите найти проблему!

P. S. Файл на хостинге, так что абсолютного пути не знаю.

$max_image_width	= 3800;
$max_image_height	= 6000;
$max_image_size		= 4*1024*1024;
$valid_types 		=  array("gif","jpg", "png", "jpeg","JPG");

if (isset($_FILES["userfile"])) {
	if (is_uploaded_file($_FILES['userfile']['tmp_name'])) {
		$filename = $_FILES['userfile']['tmp_name'];
		$ext = substr($_FILES['userfile']['name'], 
			1 + strrpos($_FILES['userfile']['name'], "."));
		if (filesize($filename) > $max_image_size) {
			echo 'Error: File size > 64K.';
		} elseif (!in_array($ext, $valid_types)) {
			echo 'Error: Invalid file type.';
		} else {
			$size = GetImageSize($filename);
			if (($size) && ($size[0] < $max_image_width) 
				&& ($size[1] < $max_image_height)) {
				if (@move_uploaded_file($filename, ".")) {
					echo 'File successful uploaded.';
				} else {
					echo 'Error: moving file failed.';
				}
			} else {
				echo 'Error: invalid image properties.';
			}
		}
	} else {
		echo "Error: empty file.";
	}
} else {
	echo  '
	<form enctype="multipart/form-data" method="post"> 
	<input type="hidden" name="MAX_FILE_SIZE" value="6400000"> 
	Send this file: <input name="userfile" type="file"> 
	<input type="submit" value="Send File"> 
	</form>';
}

★★★★★

Нашел!

Оказывается нужно было указывать не только каталог, но и имя файла. То есть:

if (@move_uploaded_file($filename, ".")) {

заменить на

if (@move_uploaded_file($filename, "./".$_FILES['userfile']['name'])) {

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

> if (@move_uploaded_file($filename, "./".$_FILES['userfile']['name'])) {

Что будет, если файл с таким именем уже существует и его закачал другой пользователь (не тот, кто изначально закачивал)? На ответ «ну и фиг с ним» упреждающий вопрос: а что если зааплодженный jpg окажется затрояненным (вроде есть/была возможность под оффтопик делать интересные джипеги)?

Сохраняйте либо по с префиксами пользователей (коды, имена), либо с уникальным хэшем в качестве имени файла (и проверяйте, что файла с таким именем ещё нет).

Slavaz ★★★★★
()

>@move_uploaded_file

Мушку спили^W^W с@баку сотри. Иногда она оправдана, но никак не в таком случае.

Увидишь, что у тебя за ошибка происходит.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Иногда она оправдана

Ставлю это под сомнение. По-моему давно уже не оправдана — спрятать ошибку — это метод страуса, она при этом ни куда не денется…

avol
()
Ответ на: комментарий от KRoN73

> if(@$x[$i])

Ошибка происходит, но она не выводится.

if(!exists($x[$i]))


Проверка, призванная избежать ошибки. Кроме того, это цивилизованный подход.
В особо сложных случаях для цивильности можно try…catch использовать, хотя тут косяки с производительностью.

avol
()
Ответ на: комментарий от avol

>Ошибка происходит, но она не выводится.

Не ошибка, а NOTICE. Но ты мне объясни, чем чревата такая нотация, в отличии от варианта с exists().

Кроме того, это цивилизованный подход.


Ты без красивых слов, по сути :)

В особо сложных случаях для цивильности можно try…catch использовать


В каком месте можно обработку исключений _в моём_ примере использовать? :D NOTICE ни разу не бросает исключения.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

> Не ошибка, а NOTICE. Но ты мне объясни, чем чревата такая нотация, в отличии от варианта с exists().

Ну всё-равно ведь этот notice происходит, это ведь какой-то исключительный случай. Можно предположить (хотя, честно говоря, я не знаю наверняка), что php это ещё неким специальным образом обрабатывает, вызывает какие-то дополнительные функции, а подавляется лишь вывод ошибки.
Т.е. в основном я здесь опасаюсь лишних действий и потерь со стороны интерпретатора.

Ты без красивых слов, по сути :)


Ну это ведь тоже важно, как-никак ;)

В каком месте можно обработку исключений _в моём_ примере использовать? :D NOTICE ни разу не бросает исключения.


Ну не здесь конечно — я же написал, что в особых случаях, где тоже просто могут подавлять вывод ошибок, мне кажется корректнее чётко проверять что требуется и обрабатывать исключительные ситуации.
Раньше в php такие возможности были ограничены, и применение @ могло быть оправдано. Сейчас же, мне кажется, применять его уже не нужно.

avol
()
Ответ на: комментарий от avol

>Ну всё-равно ведь этот notice происходит

И что из этого? :) Я просто опускаю совершенно ненужную в данном случае процедуру инициализации.

это ведь какой-то исключительный случай


Да. Но не исключение :)

Можно предположить (хотя, честно говоря, я не знаю наверняка), что php это ещё неким специальным образом обрабатывает


Можно перехватить вывод NOTICE (даже замаскированных) и писать их в лог. Но это никак не отменяет тот факт, что в данном контексте маскировка не скрывает никаких алгоритмических ошибок.

Т.е. в основном я здесь опасаюсь лишних действий и потерь со стороны интерпретатора.


Если поставишь свой обработчик ошибок - да, будут лишние действия :) Но это уже вопрос оптимизации, а не алгоритмики. То есть сама по себе маскировка не только в данном случае не является злом, но и даже NOTICE не замаскирует, если тебе понадобится их ловить.

Ну не здесь конечно — я же написал, что в особых случаях, где тоже просто могут подавлять вывод ошибок, мне кажется корректнее чётко проверять что требуется


Безусловно, в случае move_uploaded_file() маскировать ничего нельзя. О чём я вполне конкретно и написал выше: «Иногда она оправдана, но никак не в таком случае».

Когда маскировка затрудняет идентификацию ошибки - она, безусловно, вредна.

Когда (бывают такие случае, и не только с моим примером выше) «ошибка» вполне себе штатное явление и корректно отрабатывается, то можно и замаскировать.

KRoN73 ★★★★★
()
Ответ на: комментарий от KRoN73

Ну не знаю, может быть. Просто я стараюсь не использовать никогда, возможно это паранойя…

avol
()
Ответ на: комментарий от KRoN73

не прочел до конца, но это знаешь что мне напоминает: вот этот дядя негр, его можно берцом забить, а этот дядя мулат, его можно и жить оставить. в каких случаях такое поведение оправданно? ни в каких, и то что сейчас нотис нефик делать в 7ке станет исключением, а собаки не станет, ухаха!

trashymichael ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.