Зависимость регистра загружаемого Jpeg-изображения

Belyaev.Anton

Новичок
Доброго времени суток.
По многочисленным примерам писал функцию загрузки фотографии на сервер.

Получилось примерно следующее:

PHP:
//$formfilename - имя формы передающей файл
//$newfilename - имя файла, который будет создан на сервере

function uploadadimg($formfilename,$newfilename){

		if(@is_uploaded_file(@$_FILES[$formfilename]["tmp_name"])){



			if(@$_FILES[$formfilename]['type']=="image/jpeg"){

				$randnameforcashimg=rand(1000000,9999999);
				$cashimg="data/cash_".$randnameforcashimg.".jpg";

                

				if(@move_uploaded_file($_FILES[$formfilename]["tmp_name"], $cashimg)){

					if(@file($cashimg)){
						@copy($cashimg,$newfilename);
                                                                                    @unlink($cashimg);
                                                                                    return true;
					}else{
						return false;
					}

				}else{
					return false;
				}

			}else{
				return false;
			}

		}else{
			return false;
		}
	}
Всё было бы хорошо, ведь всё работало, как вдруг выяснилось , что эта функция обрабатывает не все jpeg-изображения. Начал разбираться и выяснил, что файлы с расширением ".jpg" обрабатываются, как надо, а ".JPG" не обрабатываются. $_FILES[$formfilename]["tmp_name"] остаётся пустой.

Не могли бы Вы подсказать в чём именно проблема? Что я делаю не так?
Или дела всё таки в каких то настройках (ошибка актуальна и локально и на сервере хостера).

Заранее благодарен за внимание и ответы.
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
Кхм, в чем глубинный смысл в постановке собачек везде, где только можно?
 

Духовность™

Продвинутый новичок
формат изображения как минимум нужно определять с помощью getimagesize функции. а ты тупо определяешь по mime типу. mime тип можно любой подставить - это раз.
второе - IE посылает совсем другой тип mime для jpg

поэтому проверку на mime нужно делать как минимум по двум типам - image/jpeg и image/pjpeg
 

Фанат

oncle terrible
Команда форума
Кхм, в чем глубинный смысл во вложенных проверках? почему нельзя написать return false; сразу после проверки и писать следующее условие на том же уровне?

И в чем глубокий смысл копирования через кэш?
 

Фанат

oncle terrible
Команда форума
А теперь к сути.
файлы с расширением ".jpg" обрабатываются, как надо, а ".JPG" не обрабатываются. $_FILES[$formfilename]["tmp_name"] остаётся пустой.
я очень сильно сомневаюсь в истинности этого утверждения.
Рекомендую тщательно его проверить
 

Adelf

Administrator
Команда форума
Немного не в тему, но таки напишу. Разве так не приятнее читать?

PHP:
function uploadadimg($formfilename,$newfilename)
{
	if(!is_uploaded_file($_FILES[$formfilename]["tmp_name"])) return false;

	if(!$_FILES[$formfilename]['type']=="image/jpeg") return false;

	$randnameforcashimg=rand(1000000,9999999);
	$cashimg="data/cash_".$randnameforcashimg.".jpg";

	if(!move_uploaded_file($_FILES[$formfilename]["tmp_name"], $cashimg)) return false;

	if(!file($cashimg)) return false;

	copy($cashimg,$newfilename);
	unlink($cashimg);
	return true;
}
И да. пока писал - if(!file($cashimg)) ??? Может всетаки file_exists?
 

Фанат

oncle terrible
Команда форума
Немного не в тему, но таки напишу. Разве так не приятнее читать? ;-)

PHP:
function uploadadimg($formfilename,$newfilename)
{
    if($_FILES[$formfilename]['type'] !== "image/jpeg") return false;
    return move_uploaded_file($_FILES[$formfilename]["tmp_name"], $newfilename);
}
 

Belyaev.Anton

Новичок
Всем большое спасибо за комментарии и советы. =)

я очень сильно сомневаюсь в истинности этого утверждения.
Рекомендую тщательно его проверить
Проверил ещё раз и снова убедился.
Но! раньше эта проблема возникала как локально, так и на свервере хостера. Теперь она осталась только локально - это конечно не критично, главное что бы работало на сервере, но всё же.

Предлагаю Вашему вниманию тест на локальной машине:
index.php:
PHP:
<?php


function uploadadnresizeimg($formfilename,$newfilename)
{
    print "Nam: ".@$_FILES[$formfilename]["name"]."<br>";
    print "Tmp: ".@$_FILES[$formfilename]["tmp_name"]."<br>";
    print "Typ: ".@$_FILES[$formfilename]["type"]."<br>";
    
    
    if(!is_uploaded_file($_FILES[$formfilename]["tmp_name"])) return false;

    if(!$_FILES[$formfilename]['type']=="image/jpeg") return false;

    $randnameforcashimg=rand(1000000,9999999);
    $cashimg="cash_".$randnameforcashimg.".jpg";

    if(!move_uploaded_file($_FILES[$formfilename]["tmp_name"], $cashimg)) return false;

    if(!file($cashimg)) return false;

    copy($cashimg,$newfilename);
    unlink($cashimg);
    return true;
}




?>

<form action="" method="post" enctype="multipart/form-data">

<input type="file" name="inputphoto" style="width:296px;">
	
<input type="submit" value="Upload" style="cursor:pointer;">
			
</form>

<?php uploadadnresizeimg("inputphoto","cash.jpg"); ?>

Результат положительный:


Результат противоположный положительному:
 

Belyaev.Anton

Новичок
Обьясни эту строку.
PHP:
if(!file($cashimg)) return false;
Этим способом, может и не совсем корректно, я проверял наличие в кэше изображения.
Зачем? Для того, что бы проверить отработала ли функция. Дальше дело за copy и unlik.
 

Adelf

Administrator
Команда форума
Belyaev.Anton
Теперь сходи в мануал и проверь в чем разница между функциями file и file_exists
 

c0dex

web.dev 2002-...
Команда форума
Партнер клуба
А сколько весят загружаемые файлы? Сдается мне, ты превысил лимит при загрузке второго.
 

Фанат

oncle terrible
Команда форума
Ну и при чём здесь твоя функция, если пропадание происходит ещё до её вызова?

Логика в действиях должна хоть какая-то быть?
проблема у тебя в том, что файл не загружается.
вместо того, чтобы задать именно этот вопрос, ты зачем-то написал здесь свою функцию с кучей бессмысленного кода, которая НИКАКОГО отношения к проблеме не имеет.

проверяй $_FILES[$formfilename]['error']
коды ошибок описаны в мануале.
 

Belyaev.Anton

Новичок
А сколько весят загружаемые файлы? Сдается мне, ты превысил лимит при загрузке второго.
Разобрался в Вашем вопросе и он был верной мыслью на счёт причины отказа загрузки.

На сервере:


Локально:


Всем большое спасибо за помощь!
 

Belyaev.Anton

Новичок
Фанат, Благодарю. Да, ответ был заведомо у меня под носом.

Добавил (начинать с этого надо было искать ошибку):
PHP:
print_r(@$_FILES[$formfilename]);
Результат:


Ошибка:
Значение: 1; Размер принятого файла превысил максимально допустимый размер, который задан директивой upload_max_filesize конфигурационного файла php.ini.

Описание кодов ошибки загрузки файлов:
http://php.net/manual/ru/features.file-upload.errors.php
 

Фанат

oncle terrible
Команда форума
если бы ты ещё прислушался к остальным замечаниям - к примеру, выкинул из кода совершенно бессмысленное двойное копирование, лишние проверки и уродливых собак - было бы совсем замечательно
 
Сверху