Upload, Save, Resize and Rename Image funkcija POMOĆ

1

Upload, Save, Resize and Rename Image funkcija POMOĆ

offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

Pre nekoliko godina sam uklopio nekoliko funkcija za upload, save, resize and rename slike u jednu i koristio sam je dosta često ali sada imam jedan problem.
Funkciji kada zadam veličinu 400px po širini i ako uploadujem sliku koja je 200px moja funkcija poveča tu sliku na 400px. Trebalo bi mi da zadrži 200px ali ako uploadujem sliku veću od 400px da mi smanji na 400px jer je to maksimalna veličina koja mi treba za sajt.

Ovu opciju koristim za jednu galeriju i baš sam zaglavio sa time.
Evo i funkcije:
function get_extension($str) {     $i = strrpos(stripslashes($str),".");     if (!$i) { return ""; }     return strtolower(substr($str,($i+1),(strlen($str) - $i))); } function image_size($maxwidth, $maxheight, $stringname) {    return !empty($_FILES[$stringname]['tmp_name'])?((filesize($_FILES[$stringname]['tmp_name']) > $maxwidth * $maxheight)?false:true):false; } function image_extension($stringname) {    if(!empty($_FILES[$stringname]['tmp_name']))    {       $filename = stripslashes($_FILES[$stringname]['name']);       $extension = get_extension($filename);       $extension = strtolower($extension);       $image_extension=($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif")?false:true;    }else{$image_extension=false;}    return $image_extension; } function save_image($maxwidth, $maxheight, $quality, $stringname, $folder, $imagename, $newwidth) {    if(!empty($_FILES[$stringname]['name']))    {        if($_SERVER["REQUEST_METHOD"] == "POST")        {          $image         =   $_FILES[$stringname]['name'];          $uploadedfile   =   $_FILES[$stringname]['tmp_name'];          if(empty($uploadedfile))          {$upload_image=false;}          else          {                          if ($image)             {                $filename = stripslashes($_FILES[$stringname]['name']);                $extension = get_extension($filename);                $extension = strtolower($extension);                 if (($extension != "jpg") && ($extension != "jpeg") && ($extension != "png") && ($extension != "gif"))                {$upload_image=false;}                else                {                   if (image_size($maxwidth, $maxheight, $stringname))                   {                      if($extension=="jpg" || $extension=="jpeg" )                      {                         $uploadedfile = $_FILES[$stringname]['tmp_name'];                         $src = imagecreatefromjpeg($uploadedfile);                      }                      else if($extension=="png")                      {                         $uploadedfile = $_FILES[$stringname]['tmp_name'];                         $src = imagecreatefrompng($uploadedfile);                      }                      else                      {                         $src = imagecreatefromgif($uploadedfile);                      }                                            list($width,$height)=getimagesize($uploadedfile);                                            // proverava da li je slika dozvoljene sirine, ako jeste ostavlja tu sirinu, ako ne - smanjuje je                      if($width > $maxwidth){                         // koristi vec dat $newwidth;                      } else {                         $newwidth = $width;                      }                                            $newheight=($height/$width)*$newwidth;                      $tmp=imagecreatetruecolor($newwidth,$newheight);                      imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);                      $name = $imagename;                         $filename = $folder.$name;                                            if($extension=="jpg" || $extension=="jpeg" )                      {                         imagejpeg($tmp,$filename,$quality);                      }                      else if($extension=="png")                      {                         imagepng($tmp,$filename);                      }                      else                      {                         imagegif($tmp,$filename);                      }                                            imagedestroy($src);                         imagedestroy($tmp);                         $upload_image=true;                   }                   else                   {                      $upload_image=false;                   }                }             }          }       }    }    return $upload_image; }
Hvala vam!



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3654
  • Gde živiš: 127.0.0.1

Ovo nikad nemoj da radis:

function get_extension($str) {     $i = strrpos(stripslashes($str),".");     if (!$i) { return ""; }     return strtolower(substr($str,($i+1),(strlen($str) - $i))); }

jer ja mogu slucajno (ili namerno) da png sliku sacuvam kao slika.jpg i prouzrokujem fatal error. U stvari, nikad ne veruj onome sto korisnik unese bi trebalo da ti bude ideja vodilja.

Ostalo cu da pogledam kad dodjem kuci, pa javljam.



offline
  • C# and PHP Developer
  • Pridružio: 16 Feb 2011
  • Poruke: 1627
  • Gde živiš: Pancevo

Covek ja tebe ne mogu da razumem. Iskreno zao mi te je, vidim da imas volje i znas da radis ali daj nauci taj OOP. Pises 1000 i 1000 funkcija. Eo mogao si ovo da stavis u klasu i samo da izvrtis logiku. Veruj mi radi OOP lakse ce ti biti. Ali kako god...

offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

Napisano: 22 Avg 2013 15:27

_iKaC ::Covek ja tebe ne mogu da razumem. Iskreno zao mi te je, vidim da imas volje i znas da radis ali daj nauci taj OOP. Pises 1000 i 1000 funkcija. Eo mogao si ovo da stavis u klasu i samo da izvrtis logiku. Veruj mi radi OOP lakse ce ti biti. Ali kako god...

Ovo je prastara skripta koju sam radio još kada sam počeo programiranje u PHP-u a toliko sada imam vremena samo da je primenim. Radim OOP ali ovo nisam pretvorio u to. Neke od funkcija koristim odvojeno i za druge stvari ali sam ovde sakupio na jedno mesto da bi neko od vas mogao da isproba.
Moraću ovo da "šutnem" u jednu "pametnu" klasu jer je moćna skriptica a koristio sam je za dodavanje profilne slike, slike za sadržaj ali sada je hoću koristiti za jednu galeriju i imam problema sa resize.

Obećavam da ću je kada ovo prepravim, uradiću OOP i okačiti. Wink

Dopuna: 22 Avg 2013 15:30

Rastafarii ::Ovo nikad nemoj da radis:

function get_extension($str) {     $i = strrpos(stripslashes($str),".");     if (!$i) { return ""; }     return strtolower(substr($str,($i+1),(strlen($str) - $i))); }

jer ja mogu slucajno (ili namerno) da png sliku sacuvam kao slika.jpg i prouzrokujem fatal error. U stvari, nikad ne veruj onome sto korisnik unese bi trebalo da ti bude ideja vodilja.

Ostalo cu da pogledam kad dodjem kuci, pa javljam.


čoveče, upravu si, tek sada vidim. Ovo sam koristio ne samo za slike već i za druge stvari. Eh... ovo je deo jednog mog starog jezgra za CMS i toliko je staro da ima jedno 4-5 godina. Hvala ti u napred i za ovo. Šta predlažeš za hvatanje ekstenije? Upamti, ovo koristim u nekim sistemima i za .zip, .pdf itd. kada reimenujem. Hvala ti.

offline
  • PHP Developer
  • Pridružio: 02 Okt 2005
  • Poruke: 546

http://php.net/manual/en/function.exif-imagetype.php
http://www.php.net/manual/en/function.finfo-file.php

offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

|_MeD_| ::http://php.net/manual/en/function.exif-imagetype.php
http://www.php.net/manual/en/function.finfo-file.php


E hvala ovo dosta pomaže. Uz dobru klasu mogu napraviti proveru za sve.
Još samo da skontam ovo u vezi resize slike.

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Deluje mi kao da je sve u redu. Predlažem ti da preko debugera pogledaš šta se dešava u delu:
if($width > $maxwidth) {   // koristi vec dat $newwidth; } else {   $newwidth = $width; }
I prođi posle kroz kod za resize. Verovatno je neka jednostavna stvar.

offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

Evo poklon od mene, jedan kod koji sam razvio i po obećanju uradio OOP.
Ako nekome mogu pomoći sa ovim srećno!
/* ===================== UPLOAD IMAGE ON SERVER WITH CHECK AND RESIZE ===================== * By: FoxVanis * foxvanis@gmail.com * This is open source and all changes are allowed. ================================================================ // Setup class to recive input:    $name      =   'image';   // this is file name from upload form ($_FILE['image'])    $maxwidth           =   1280;   // maximal width 1280px    $maxheight   =   1024;   // maximal height 1024px    $newwidth           =   800;      // new width 800px    $newheight   =   false;   // automatically adjust the height according to the width of the diagonal    $image = new image($name, maxwidth, $maxheight, $newidth, $neweight); ================================================================ // Check size of image what you whant to upload (true/false)    if($image->size())    {       echo 'Size is OK';    }    else    {       echo 'Too large image';    } ================================================================ // Check if image in optimal minimal and maximal dimensions (true/false)    $minwidth   =   200; // minimal width 200px    $minheight   =   200; // minimal height 200px    if($image->dimensions($minwidth, $minheight))    {       echo 'Size is OK';    }    else    {       echo 'This image is not optimal dimension';    } ================================================================ // Save image on server (true/false)    $imagename   =   'image_name';    $folder      =   'image/';    $quality   =   100;   // min 0% max 100%    if($image->save($imagename,$folder,$quality))    {       echo 'Image is saved';    }    else    {       echo 'Image not saved';    } ================================================================ */ class image {    private $gif      =   IMAGETYPE_GIF;    private $jpg       =   IMAGETYPE_JPEG;    private $png       =   IMAGETYPE_PNG;    private $maxwidth   =   false;    private $maxheight   =   false;    private $name      =   false;    private $newwidth   =   false;    private $newheight   =   false;    /*================== PRIVATE AND GENERAL FUNCTIONS ==================*/    public function image($name=false,$maxwidth=false,$maxheight=false,$newwidth=false,$newheight=false)    {       $this->name      =   !empty($name)      ?   $name      :   false;       $this->maxwidth   =   !empty($maxwidth)   ?   $maxwidth      :   false;       $this->maxheight   =   !empty($maxheight)   ?   $maxheight   :   false;       $this->newwidth   =   !empty($newwidth)   ?   $newwidth      :   false;       $this->newheight   =   !empty($newheight)   ?   $newheight   :   false;    }    private function ext()    {       $img = stripslashes($_FILES[$this->name]['name']);       return exif_imagetype($img);    }    /*==================================================================*/        // image size    public function size()    {       if(!empty($this->name) & !empty($this->maxwidth) & !empty($this->maxheight))       return (!empty($_FILES[$this->name]['tmp_name'])       ?((filesize($_FILES[$this->name]['tmp_name'])>$this->maxwidth*$this->maxheight)?false:true):false);       else die ("ERROR: class image->size() must have all property defined!");    }    // check strict image dimensions    public function dimensions($minwidth, $minheight)    {       if(!empty($this->name) & !empty($minwidth) & !empty($minheight) & !empty($this->maxwidth) & !empty($this->maxheight))       {          if(!empty($_FILES[$this->name]['tmp_name']))          {             $image = $_FILES[$this->name]['tmp_name'];             $image_size = getimagesize($image);             return (                $image_size[0] >= $minwidth &&                $image_size[0] <= $this->maxwidth &&                $image_size[1] >= $minheight &&                $image_size[1] <= $this->maxheight             )             ? true : false;          } else return false;       } else die ("ERROR: class image->dimensions($name, $minwidth, $minheight, $maxwidth, $maxheight) must have all property defined!");    }    // save image on server    public function save(       $imagename   =   false,       $folder      =   false,        $quality      =   100    )    {       if(!empty($_FILES[$this->name]['name']))       {          if(($_SERVER["REQUEST_METHOD"] == "POST") || ($_SERVER["REQUEST_METHOD"] == "GET"))           {             $image      =   $_FILES[$this->name]['name'];             $uploadedfile   =   $_FILES[$this->name]['tmp_name'];             if(!empty($uploadedfile))             {                $extension=$this->ext($name);                if (($extension == $this->jpg) && ($extension == $this->png) && ($extension == $this->gif))                {                   if ($this->size())                   {                      $src = false;                      if($extension == $this->jpg)                         $src = imagecreatefromjpeg($uploadedfile);                      else if($extension == $this->png)                         $src = imagecreatefrompng($uploadedfile);                      else if($extension == $this->gif)                         $src = imagecreatefromgif($uploadedfile);                      if(!empty($src))                      {                         list($width,$height)=getimagesize($uploadedfile);                         $newwidth=(($width > $this->newwidth) ? $this->newwidth : $width);                         $newheight=!empty($this->newheight)?$this->newheight:(($height/$width)*$newwidth);                         $tmp=imagecreatetruecolor($newwidth,$newheight);                         imagecopyresampled($tmp,$src,0,0,0,0,$newwidth,$newheight,$width,$height);                            $filename = $folder.$imagename;                         if($extension==$this->jpg) imagejpeg($tmp,$filename,$quality);                         else if($extension==$this->png) imagepng($tmp,$filename);                         else if($extension==$this->gif) imagegif($tmp,$filename);                         imagedestroy($src);   imagedestroy($tmp);                         return true;                      } else return false;                   } else return false;                } else return false;             } else return false;          } else return false;       } else return false;    } }
Ovo kopirajte u svoj CMS pratite tutorijal i radiće. Mene super služi. Ziveli

offline
  • PHP developer
  • Pridružio: 22 Mar 2006
  • Poruke: 3654
  • Gde živiš: 127.0.0.1

Ovo podrazumeva da je EXIF biblioteka ucitana, a pretpostavka je majka svih zajeba. Mozes da koristis funkciju getimagesize(), koja ne zahteva nijednu dodatnu biblioteku, a sasvim zavrsava posao (obrati paznju na treci element niza koji vraca).

Drugo - ne prekidaj izvrsavanje skripte sa die(), nego baci Exception, koji posle u kodu mozes da uhvatis i prikazes gresku kakvu hoces, a ne belu stranu sa crnim tekstom "Something went wrong".

Za PNG tip slike totalno ignorises podesavanje kvaliteta Wink treci parametar f-je imagepng(). Konstante IMAGETYPE_* bez ikakve potrebe guras u private promenljive. Ne dozvoljavas korisniku da podesi minimalnu visinu i sirinu...

offline
  • Web Designer, PHP Developer; HTML, CSS, SQL, jQuery Programmer
  • Pridružio: 13 Jun 2010
  • Poruke: 307
  • Gde živiš: Subotica

Rastafarii hvala ti. Ovo je dosta korisan savet. izvršio sam 90% izmena koje si naveo, samo me zanima Exception. To ne razumem nešto. Znam da ide sa try{}catch... ali nisam shvatio poentu. Možeš malo da pojasniš?

Izmene ću okačiti kada sve kompletiram.

Ko je trenutno na forumu
 

Ukupno su 439 korisnika na forumu :: 8 registrovanih, 0 sakrivenih i 431 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3028 - dana 22 Nov 2019 07:47

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: bato, Boris90, Deneb, djordje92sm, Faki-Valjevo, milenko crazy north, Miskohd, nikola287