Не аплоадятся некоторые изображения

Toshik39Rus

Новичок
Не аплоадятся некоторые изображения

Здравствуйте. Полдня проблуждав по содержательному форуму и перечитав уйму статей про аплоады и ресайзы, написал что то похожее на "унылое га*но", но и оно работает через раз.

В общем задача: Загрузить фотографию через форму, после её обработает php-скрипт и вырежет квадрат нужного мне размера (87х87) из уменьшенной копии. Принцип как в фотогалерее на mail.ru. Вверху показывается фото, а внизу альбом из одинаковых маленьких квадратов.

Проблема: Скрипт обрабатывает изображения "по настроению". Одни обрабатывает - другие - нет. И не важно, что имя на русском, горизонтальная или вертикальная фотография - он обрабатывает все варианты, тока некоторые без проблем, а другие никак.

Собсно скрипт:
PHP:
<?
$img=$_FILES['userfile']['tmp_name'];
$newimg="data/img.jpg";    
$img=imagecreatefromjpeg($img);
$w=imagesx($img);
$h=imagesy($img);
if($w<$h){$kof=$w/87;}else{$kof=$h/87;}
$w=round($w/$kof);
$h=round($h/$kof);
$img1=imagecreatetruecolor(87,87);
$ol=$w/2;
$ob=$h/2;
imagecopyresampled($img1,$img,0,0,0,0,$w,$h,imagesx($img),imagesy($img));
imagejpeg($img1,$newimg,99);
imagedestroy($img);
imagedestroy($img1);
?>
    
    <form action="<? echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post"> 
  Send this file: <input name="userfile" type="file"> 
  <input type="submit" value="Send File"> 
</form>
Вот то, что он выдаёт при отрицательном исходе:


PS Я конечно понимаю, что я с полным бредом пришёл к опытным специалистам, но всё же прошу внимания) ибо все были начинающими. Всем огромное спасибо за внимание и ответы.
 

Single

пилот капсулы
Перед тем как применять функцию [m]imagecreatefromjpeg[/m] проверяй что у тебя содержится в переменной
PHP:
$_FILES['userfile']['tmp_name'];
+ не помешает прочитать debug
 

korpus

злой бобёр
Re: Не аплоадятся некоторые изображения

Автор оригинала: Toshik39Rus
Одни обрабатывает - другие - нет. И не важно, что имя на русском, горизонтальная или вертикальная фотография - он обрабатывает все варианты, тока некоторые без проблем, а другие никак.
А конкретно что не так? В каких случая обрабатывает, а в каких нет?
 

Toshik39Rus

Новичок
Всё. Разобрался. Дело было в том, что фотографии более 2мб скрипт не обрабатывал.

После небольшой доводки, получилось следующее:
PHP:
<?
function cpi($fnm,$newimg,$needsize){
$img = $_FILES[$fnm]['tmp_name'];  
$filesize = $_FILES[$fnm]['size'];
if(!$filesize){ return false; break; }
$img=imagecreatefromjpeg($img);
$w=imagesx($img);
$h=imagesy($img);
if($w<$h){$kof=$w/$needsize;$b="w";}elseif($h<$w){$kof=$h/$needsize;$b="h";}else{$kof=$needsize;$b="x";}
$w=round($w/$kof);
$h=round($h/$kof);
$img1=imagecreatetruecolor($needsize,$needsize);
if($b=="w"){$ol=$w;}elseif($b=="h"){$ob=$h;}else{$ol=0;$ob=0;}
imagecopyresampled($img1,$img,0,0,$ob,$ol,$w,$h,imagesx($img),imagesy($img));
imagejpeg($img1,$newimg,99);
imagedestroy($img);
imagedestroy($img1);
}



cpi("userfile","gotovo/img.jpg",87);

?>
userfile - Имя файлового поля формы
gotovo/img.jpg - имя готового "квадрата"
87 - нужный размер стороны квадрата

осталось ещё добавить проверку типа файла и впринципе готово.
Терзайте мой итог))

Всем спасибо за внимание!
 

Вурдалак

Продвинутый новичок
«Трогать» $_FILES[$fnm]['tmp_name'] нельзя ничем, кроме is_uploaded_file()/move_uploaded_file(). Не везде будет работать.
 

korpus

злой бобёр
Автор оригинала: Вурдалак
«Трогать» $_FILES[$fnm]['tmp_name'] нельзя ничем, кроме is_uploaded_file()/move_uploaded_file(). Не везде будет работать.
А разве в скрипте что-то не так? Вроде всё корректно сделано.
 

Toshik39Rus

Новичок
Так так так, уважаемые, можно по подробнее. Как ради теста отрубить эти параметры на Денвере? (Простите, если конечно оффтоплю)

И ещё хотел добавить, что в скрипте однозначно не "всё корректно" ибо я такими "огородами" пришёл к результату получения собственно самого "центрального квадрата"...

PHP:
<?
if($w<$h){$kof=$w/$needsize;$b="w";}elseif($h<$w){$kof=$h/$needsize;$b="h";}else{$kof=$needsize;$b="x";} 
$w=round($w/$kof); 
$h=round($h/$kof); 
$img1=imagecreatetruecolor($needsize,$needsize); 
if($b=="w"){$ol=$w;}elseif($b=="h"){$ob=$h;}else{$ol=0;$ob=0;}
?>
Эт меня самого аж пугает)))))) Но так сказать метод тыка привёл к результату.
 

Toshik39Rus

Новичок
Автор оригинала: Вурдалак
«Трогать» $_FILES[$fnm]['tmp_name'] нельзя ничем, кроме is_uploaded_file()/move_uploaded_file(). Не везде будет работать.
То есть я так понял, что после проверки
PHP:
<? is_uploaded_file($_FILES[$fnm]['tmp_name']); ?>
для дальнейших операций я должен копировать это "затемпованное" изображение
PHP:
<? move_uploaded_file($_FILES[$fnm]['tmp_name'], $img) ?>
и уже потом над "$img" совершать остальные действия, тем самым избавившись от "троганья" $_FILES[$fnm]['tmp_name'].

После небольшого разбора полётов, переработал строчки, которые "решают", сколько и с какой стороны обрезать, то есть теперь квадрат вырезается точно с центра и у изображению любого масштаба. И ещё я принял ввиду неприкосновенность $_FILES[$fnm]['tmp_name'] и реализовал своеобразное кэширование, над которым потом и идут все издевательства.
PHP:
<?
function cpi($fnm,$newimg,$needsize){
$filesize = $_FILES[$fnm]['size'];
$img="gotovo/cash_img.jpg";
if(!is_uploaded_file($_FILES[$fnm]['tmp_name'])){ return false; break; }
if(!move_uploaded_file($_FILES[$fnm]['tmp_name'], $img)){ return false; break; }
if(!$filesize){ return false; break; }
$img=imagecreatefromjpeg($img);
$w=imagesx($img);
$h=imagesy($img);
$ob=0;$ol=0;
if($w>$h){
$kof=$h/$needsize;$ob=($w-$h)/2;$ob=round($ob);
}elseif($h>$w){
$kof=$w/$needsize;$ol=($h-$w)/2;$ol=round($ol);
}else{
$kof=$needsize;
}
$w=round($w/$kof);
$h=round($h/$kof);
$img1=imagecreatetruecolor($needsize,$needsize);
imagecopyresampled($img1,$img,0,0,$ob,$ol,$w,$h,imagesx($img),imagesy($img));
imagejpeg($img1,$newimg,99);
imagedestroy($img);
imagedestroy($img1);
}
cpi("userfile","gotovo/img.jpg",87);   
?>

<form action="<? echo $_SERVER['PHP_SELF']; ?>" enctype="multipart/form-data" method="post"> 
Send this file: <input name="userfile" type="file"> 
<input type="submit" value="Send File"> 
</form>
Хотел бы ещё поинтересоваться, как удалить закешированный "$img" после работы скрипта, ибо "анлинк" выдаёт ошибку "Warning: unlink() expects parameter 1 to be string". И ещё не могу понять как корректно сюда приделать проверку на расширение, чтобы к обработке принимались только лишь .jpeg/.jpg/.gif/.png и сохранялись соответственно в том же расширении.
 

Single

пилот капсулы
для дальнейших операций я должен копировать это "затемпованное" изображение ... и уже потом над ... совершать остальные действия
Ты определись с начало нужно ли тебе копировать загруженный файл в свою временную директорию с последующей модификацией этого файла.
Предположим у тебя на компьютере лежит какой то файл который нужно модифицировать. Для модификации этого файла ты всегда создаешь копию оригинала с целью создания модифицированной версии копии оригинала? :)

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