M. Niyazi Alpay
M. Niyazi Alpay
M. Niyazi Alpay

Çok küçük yaştan itibaren bilgisayar sistemleriyle ilgileniyorum ve 2005 yılından beri programlama ile uğraşıyorum, PHP, MySQL, Python, MongoDB ve Linux konularında bilgi sahibiyim

 

about.me/Cryptograph

  • admin@niyazi.org

PHP Resim Upload ve Boyutlandırma Sınıfı

PHP Resim Upload ve Boyutlandırma Sınıfı

Merhabalar, sizlere hazırlamış olduğum resim boyutlandırma ve upload classını göstereceğim. Daha önceki konumda nesne tabanlı programlamadan bahsetmiştim. Şimdiki anlatacağım konu ise nesne tabanlı olarak resim boyutlandırma ve upload üzerine bir classdır
Fazla uzatmadan classı anlatmaya başlayım :)

<?php
class ResimIslem{
    private function dosya_uzantisi($dosya,$uzanti=-1){
        $b = strrpos($dosya,".");
        $b++;
        if($uzanti!=-1)
        {
            $cik = substr($dosya,$b,$uzanti);
        }
        if($uzanti==-1)
        {
            $cik = substr($dosya,$b);
        }
        $cik = strtolower($cik);
        return $cik;
    }

    private function resim_boyutlandir($resim,$max_en=1920,$max_boy=1200,$uzanti){
        // içeriği başlat..
        ob_start();
        // ilk boyutlar..
        $boyut = getimagesize($resim);
        $en    = $boyut[0];
        $boy   = $boyut[1];
        // yeni boyutlar..
        $x_oran = $max_en  / $en;
        $y_oran = $max_boy / $boy;

        // boyutları orantıla..
        if (($en <= $max_en) and ($boy <= $max_boy)){
            $son_en  = $en;
            $son_boy = $boy;
        }
        elseif (($x_oran * $boy) < $max_boy){
            $son_en  = $max_en;
            $son_boy = ceil($x_oran * $boy);
        }
        else{
            $son_en  = ceil($y_oran * $en);
            $son_boy = $max_boy;
        }

        // uzantıya göre yeni resmi yarat..
        switch($uzanti){
            // jpg ve jpeg uzantılar için..
            case 'jpg':
            case 'jpeg':
                // eski ve yeni resimler..
                $eski = imagecreatefromjpeg($resim);
                $yeni = imagecreatetruecolor($son_en,$son_boy);
                // eski resmi yeniden oluştur..
                imagecopyresampled($yeni,$eski,0,0,0,0,$son_en,$son_boy,$en,$boy);
                // yeni resmi bas ve içeriği çek..
                imagejpeg($yeni,null,60);
                break;
            // png uzantılar için..
            case 'png':
                $eski = imagecreatefrompng($resim);
                $yeni = imagecreatetruecolor($son_en,$son_boy);
                imagealphablending($yeni, false);
                imagesavealpha($yeni, true);
                $transparent = imagecolorallocatealpha($yeni, $son_en, $son_boy, $en, $boy);
                imagefilledrectangle($yeni, 0, 0, $son_en, $son_boy, $transparent);
                imagecopyresampled($yeni,$eski,0,0,0,0,$son_en,$son_boy,$en,$boy);
                imagepng($yeni,null,-1);
                break;
            // gif uzantılar için..
            case 'gif':
                $eski = imagecreatefromgif($resim);
                $yeni = imagecreatetruecolor($son_en,$son_boy);
                imagealphablending($yeni, false);
                imagesavealpha($yeni, true);
                $transparent = imagecolorallocatealpha($yeni, $son_en, $son_boy, $en, $boy);
                imagefilledrectangle($yeni, 0, 0, $son_en, $son_boy, $transparent);
                imagecopyresampled($yeni,$eski,0,0,0,0,$son_en,$son_boy,$en,$boy);
                imagegif($yeni,null,-1);
                break;
            default:
                break;
        }

        $icerik = ob_get_contents();
        ob_end_clean();
        imagedestroy($eski);
        imagedestroy($yeni);

        return $icerik;
    }


    private function adlandir($baslik){
        $bul = array('Ç', 'Ş', 'Ğ', 'Ü', 'İ', 'Ö', 'ç', 'ş', 'ğ', 'ü', 'ö', 'ı', '-');
        $yap = array('c', 's', 'g', 'u', 'i', 'o', 'c', 's', 'g', 'u', 'o', 'i', ' ');
        $perma = strtolower(str_replace($bul, $yap, $baslik));
        $perma = preg_replace("@[^A-Za-z0-9\\-_]@i", ' ', $perma);
        $perma = trim(preg_replace('/\s+/',' ', $perma));
        $perma = str_replace(' ', '-', $perma);
        return $perma;
    }

    public function resim_upload($file_name,$file_tmp,$file_error,$file_path,$name,$en=1920,$boy=1200){
        $uzanti = $this->dosya_uzantisi($file_name);
        $yeni_ad = $this->adlandir($name);

        $yeni = $yeni_ad.'.'.$uzanti;

        $max_en = $en;
        $max_boy = $boy;

        $b_resim = $file_path.'/orijinal-'.$yeni;
        $k_resim = $file_path.'/'.$yeni;

        if($uzanti=='jpg' or $uzanti=='jpeg' or $uzanti=='png' or $uzanti=='gif'){
            ///chmod($file_path."/", 777);
            if($file_error==0){
                move_uploaded_file($file_tmp,$b_resim);

                $icerik = $this->resim_boyutlandir($b_resim,$max_en,$max_boy,$uzanti);

                $dosya  = fopen($k_resim,"w+");

                fwrite($dosya,$icerik);

                fclose($dosya);


                @unlink($b_resim);
                ///chmod($file_path, 755);
                return $yeni;
            }
            elseif($file_error==1) return '<strong>php.ini</strong> de belirtilmiş olan "upload_max_filesize" ayarını aşan boyutta bir dosya gönderilmeye çalışılıyor';
            elseif($file_error==2) return 'Formdaki MAX_FILE_SIZE alanının değerini aşan bir dosya gönderilmeye çalışılıyor.';
            elseif($file_error==3) return 'Dosya gönderimi tam olarak tamamlanamadı.';
            elseif($file_error==4) return 'Dosya yüklenemedi.';
            elseif($file_error==6) return 'Geçici dosya bulunamıyor.';
            elseif($file_error==7) return 'Dosya yazılamıyor.';
        }

        else{
            ///chmod($file_path, 777);
            @unlink($k_resim);
            ///chmod($file_path, 755);
            return false;
        }
    }
}

?>

Class içerisindeki ilk fonksiyonumuz yüklenen dosyanın uzantısını bulmak için. İkinci fonksiyonumuz resmi yeniden boyutlandırmak için. Genelde resim boyutlandırmada png resimlerin transparent yerleri siyahlaşıyor veya daha farklı şekilde bozuluyor, buradaki boyutlandırma fonksiyonunda resmin transparent özelliği korunuyor. Fonksiyon dışarıdan dosya bilgisi, maximum yükseklik - genişlik ve uzantı bilgilerini alıp ona göre işlem yapıyor. Üçüncü fonksiyonumuz dosyayı yeniden adlandırmak için, dosya isminde Türkçe karakter varsa onları temizlemek için. Son fonksiyonumuz ise resmi upload etmek için. Fonksiyona sırasıyla post ile gelen dosyayı, dosyanın yükleneceği klasör veya yolu, dosyanın yeni ismi, dosyanın yükseklik ve genişlik değerleri giriliyor. Bu fonksiyon resmi upload ettikten sonra class içindeki diğer fonksiyonları kullanarak uzantıyı buluyor, yeniden adlandırıyor, uzantı eğer bir resim dosyasıysa (jpg, jpeg, png ve gif) upload işlemini gerçekleştirip yeniden boyutlandırma yapıyor ve orijinal dosyayı siliyor.

Resim yeniden boyutlandırılmasın orijinal hali yüklensin isteyenler vardır. Fakat yeniden boyutlandırmanın yararlarından biri; dosya uzantısı jpeg yapılarak sisteme zararlı bir dosya yüklenebilir yeniden boyutlandırma sırasında dosya gerçekten resim dosyası değilse boyutu 0 byte olarak kaydediliyor yani içeriği siliniyor.

Classın kullanımı ise şöyle; bu kodları ResimIslem.php olarak kaydedin, daha sonra bu dosyayı resmi post ettiğiniz dosyaya include edin ve şu kodları yazın

$dosya  =  new ResimIslem();
$upload=$dosya->resim_upload($_FILES["formdan_gelen_resim"]["name"], $_FILES["formdan_gelen_resim"]["tmp_name"], $_FILES["formdan_gelen_resim"]["error"], 'yuklenecek/dizin', 'dosyanın adı', 1920, 1080, 'watermark-resmi');
echo $upload.' Dosyası başarıyla yüklendi.';  

Post ile gelen dosyanın 3 farklı parametresi var dosya yüklenirken ilk önce serverda temp dizinine atılır oradan belirlediğimiz klasöre aktarılır; post ile gelen dosyanın name bilgisi tmp bilgisi, yükleme esnasında oluşabilecek olası hataları görebilmemiz için error parametrelerini, dizin, dosya adı ve boyutlandırma bilgilerini girerek dosyayı yüklemiş olduk. Fonksiyon dosyanın adını da yükleme işleminden sonra dışarıya gönderiyor. Bu sayede de upload işleminden sonra dosya adını veritabanına kaydedebilir ya da ile ekranda da resmi gösterebilirsiniz.

Ayrıca resminizin üzerine filigran ekleyebilirsiniz, filigran için watermak-resmi olarak belirttiğim alana filigran resminizin yolunu belirtebilirsiniz

Bir sonraki konumda bu class ile çoklu resim uploadı yapmayı anlatacağım.

Muhammed Niyazi ALPAY - Cryptograph

Senior Software Developer & Senior Linux System Administrator

Meraklı

PHP MySQL MongoDB Python Linux Cyber Security

Bunları da okumak isteyebilirsiniz

Hiç yorum yok

Yorum Bırakın

E-posta adresiniz yayınlanmayacaktır. Zorunlu alanlar * ile işaretlenmiştir