Наш чат в Telegram для обмена идеями, проектами, мыслями, людьми в сфере ИТ г.Ростова-на-Дону: @it_rostov

Передача изображения на сервер через форму, изменение его размера и сохранение на диск

После заполнения элементов формы изображение передается на сервер в переменной pURL. Проверка корректности заполнениия формы на стороне клиента удалена для упрощения примера. Примеры проверки Вы найдете в разделе примеров javascript. После проверки типа изображения оно сохраняется из временного файла в указанную папку с привязкой к записи в базе. Для упрощения примера работа с базой исключена из рассмотрения. Дальше с помощью функции Resize изображение уменьшается с сохранением пропорций и приводится к формату jpeg.

<?
// определяю папку, куда буду складывать полученные изображения
define("path_image",'/pic/');

if(isset($_REQUEST['name'])){
   // сохраняю в базу и получаю $id записи, для привязки изображения к этой записи
   if($fil=SaveFile('pURL','p'.$id)){
        // $fil - имя файла изображения
        // 320 - максимальный размер в пикселях
       Resize($fil,'p'.$id,320);
   }
}
?>
// не использую "ACTION=", т.к. передаю изображение текущему файлу-обработчику
<form enctype='multipart/form-data' method="POST" onSubmit="return validator(this);">
Ф.И.О.: <input style="WIDTH: 99%" name="name" /><br>
Фото: <input type='file' name='pURL' size=60 /><br>
<input style="WIDTH: 100px" type=submit value="Отправить!">
</form>

<script language="javascript">
// проверка правильности заполнения формы
function validator(theForm) {return true;}
</script> 

<?
// сохранение фото
function SaveFile($purl,$filename){
 if(isset($_FILES[$purl]['name'])){
   $pURL    =$_FILES[$purl]['tmp_name'];
   $pURL_type    =$_FILES[$purl]['type'];
   $pURL_name    =$_FILES[$purl]['name'];
   //print"<br>".$purl."   ".$filename;print_r($_FILES);
   if (!empty($pURL_name)&&$_FILES[$purl]['error'])
       print "Ошибка(<b>".$_FILES[$purl]['error']."</b>) загрузки файла <b>".$pURL_name."</b> на сервер!";
   elseif (isset($pURL_type) && ($pURL_type!=''))
       {if ($pURL_type=='image/gif'||$pURL_type=='image/jpeg'||$pURL_type=='image/pjpeg'||$pURL_type=='image/png')
       {$nname=$_SERVER['DOCUMENT_ROOT'].path_image.$filename.'.'.GetExt($pURL_name);
            if ( move_uploaded_file($pURL, $nname) )
               print "Сохранил в ".$nname; return $nname;
            else print "Не смог сохранить ".$pURL." в ".$nname;
       }
      elseif ($pURL!='')  print "Неверный тип $pURL_type";
    }

}

function GetExt($file){ // возвращает расширение файла
$ext=strtolower(substr(strrchr(basename($file), '.'),1));
switch ( $ext ){
   case 'jpeg': case 'jpg':
    return 'jpg';
   case 'gif':
    return $ext;
   case 'png':
    return $ext;
   default:
    return false;
}}

// изменение размера с сохранением пропорций изображения
function Resize($img,$target,$max){
// $img - с полным путем, $target без пути, $max - максим. размер
$width=$max;
$height=$max;

switch ( $ext=GetExt($img) ){
   case 'jpg':
    $srcImage = @ImageCreateFromJPEG($img);
    break;
   case 'gif':
    $srcImage = @ImageCreateFromGIF($img);
    break;
   case 'png':
    $srcImage = @ImageCreateFromPNG($img);
    break;
   default:
    die('Неверный формат файла изображения!');
}
$srcWidth = ImageSX($srcImage);
$srcHeight = ImageSY($srcImage);
if(($width < $srcWidth) || ($height > $srcHeight))
{
    $ratioWidth = $srcWidth/$width;
    $ratioHeight = $srcHeight/$height;
    if($ratioWidth < $ratioHeight)
       {
    $destWidth = intval($srcWidth/$ratioHeight);
    $destHeight = $height;
       }
    else
       {
    $destWidth = $width;
    $destHeight = intval($srcHeight/$ratioWidth);
       }
    // на этапе отладки вывожу получившийся размер
    echo "Width=".$destWidth." Height=". $destHeight;
    $resImage = ImageCreateTrueColor($destWidth, $destHeight);
    ImageCopyResampled($resImage, $srcImage, 0, 0, 0, 0, $destWidth, $destHeight, $srcWidth, $srcHeight);
    $target=$_SERVER['DOCUMENT_ROOT'].path_image.$target.'.jpg';    

    ImageJPEG($resImage, $target, 100); // 100 - максимальное качество

    ImageDestroy($srcImage);
    ImageDestroy($resImage);
}}

.