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

PHP Çoklu Resim Upload ve Boyutlandırma

PHP Çoklu Resim Upload ve Boyutlandırma

Merhaba, önceki konumda resim upload ve boyutlandırma classını anlatmıştım. Bu konuda aynı classı kullanarak birden fazla resmi nasıl upload edeceğimizi anlatacağım.

İlk önce boş bir html açalım ve içine şunları yazalım:

<form action="upload.php">
   <input type="file" name="resim[]" multiple>
   <input type="submit" value="Yükle">
</form>

Inputun name kısmında [] böyle bir ifade kullandık, bu resim nameinin array tipli olacağını gösterir. Yani bu değer upload.php dosyasına içinde birden fazla veri bulunan bir dizi değişkeni olarak gönderilecek.
upload.php dosyasına da içine de şunları yazalım:

include 'resim.class.php';
$upload  =  new ResimIslem();
foreach($_FILES["resim"]["name"] as $n => $name) {
   if(!empty($name)) {
     echo $upload->resim_upload($_FILES["resim"]["name"][$n],$_FILES["resim"]["tmp_name"][$n],$_FILES["resim"]["error"][$n],'resim-dizini','dosya ismi - '.$n,1920,1200);
   }
}

resim.class.php bizim ResimIslem sınıfının bulunduğu dosya. Html formdan resim[] nameinin değeri array tipli geldiği için foreach ile bunu döngüye alıp dizinin indis numarasını $n değişkenine, gelen dosya ismini de $name değişkenine atadık. Döngü içinde dosya adını kontrol ettirdik, dosya ismi boş değilse resim_upload() fonksiyonunu çağırdık ve upload işlemi gelen her dosya için döngü boyunca tek tek yapıldı.

$_FILES["resim"]["name"][$n] şeklinde kullanmamızın sebebi de $n ilk sıfırdan başıyor ve döngü boyunca her defasında 1 artıyor. $_FILES["resim"]["name"][0] gelen ilk dosyanın bilgisini $_FILES["resim"]["name"][1] ikinci dosyanın bilgisini $_FILES["resim"]["name"][3] üçündü dosyanın bilgisini verecek şekilde devam ediyor. Döngü kullanmamızın sebebi bu sayıyı döngü boyunca artırıp çoklu upload işlemini sağlamak.

Bunları da okumak isteyebilirsiniz

4 yorum

  • şenol
    şenol
    04 Haz 2017 05:11

    güzel bir çalışma fakat dik resimlerde çalışmıyor dikresimlerde yüklendiğinde yatay geliyor

  •  Cryptograph
    Cryptograph
    05 Haz 2017 05:32

    Merhaba, önceki konumda anlatmış olduğum resim.class.php dosyasının güncel hali aşağıdaki gibi, aynı konuda da ilgili kodların güncellemesini gerçekleştirdim. Bunlarla dik bir resimde denediğimde orantısını bozmadan yeniden boyutlandırarak upload işlemini gerçekleştirdim.

    <?php
    class ResimIslem{
    
        public function watermark($filigran, $source_file_path, $output_file_path )
        {
            list( $source_width, $source_height, $source_type ) = getimagesize( $source_file_path );
    
            if ( $source_type === NULL )
            {
                return false;
            }
    
            switch ( $source_type )
            {
                case IMAGETYPE_GIF:
                    $source_gd_image = imagecreatefromgif( $source_file_path );
                    break;
                case IMAGETYPE_JPEG:
                    $source_gd_image = imagecreatefromjpeg( $source_file_path );
                    break;
                case IMAGETYPE_PNG:
                    $source_gd_image = imagecreatefrompng( $source_file_path );
                    break;
                default:
                    return false;
            }
    
            $overlay_gd_image = imagecreatefrompng($filigran);
            $overlay_width = imagesx( $overlay_gd_image );
            $overlay_height = imagesy( $overlay_gd_image );
    
            imagecopymerge(
                $source_gd_image,
                $overlay_gd_image,
                $source_width - $overlay_width,
                $source_height - $overlay_height,
                0,
                0,
                $overlay_width,
                $overlay_height,
                60
            );
    
            imagejpeg( $source_gd_image, $output_file_path, 100 );
    
            imagedestroy( $source_gd_image );
            imagedestroy( $overlay_gd_image );
        }
    
    
        public function resim_boyutlandir($resim,$k_resim,$max_en=1920,$max_boy=1200){
            // içeriği başlat..
            $resimdosyasi= pathinfo($resim);
            $uzanti=$resimdosyasi["extension"];
            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,85);
                    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);
                    break;
                default:
                    $eski=null;
                    $yeni=null;
                    break;
            }
    
            $icerik = ob_get_contents();
            // resimleri yoket ve içeriği çıkart..
            ob_end_clean();
            imagedestroy($eski);
            imagedestroy($yeni);
    
            $dosya  = fopen($k_resim,"w+");
    
            fwrite($dosya,$icerik);
    
            fclose($dosya);
    
            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,$filigran=null){
    
            $resimdosyasi= pathinfo($file_name);
            $uzanti=$resimdosyasi["extension"];
    
            $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'){
    
                if($file_error==0){
                    move_uploaded_file($file_tmp,$b_resim);
    
                    $this->resim_boyutlandir($b_resim,$k_resim,$max_en,$max_boy);
    
                    @unlink($b_resim);
                    ///chmod($file_path, 755);
    
                    if($filigran!=null){
                        $this->watermark($filigran,$k_resim,$k_resim);
                    }
    
                    return $yeni;
                }
                else return $file_error;
            }
    
            else{
                @unlink($k_resim);
                return false;
            }
        }
    }
    

  • zafer
    zafer
    16 Haz 2018 20:00

    upload.php de

    foreach($_FILES["resim"]["name"] as $n => $name) {

    de hata mesajı veriyor..

    yardımcı olursan sevinirim..

  •  Cryptograph
    Cryptograph
    17 Tem 2018 00:02

    Yükleme yapılacak dizinin yazılabilirlik izinlerini kontrol ettiniz mi veya hata loglarına baktınız mı?

    Bu gibi problemler genelde yükleme yapılacak dizinin yazılabilir olmamasından kaynaklanabilmektedir. Hata loglarını kontrol edebilirseniz sorunun çözümüne daha çabuk ulaşabilirsiniz.

Siz de yorum bırakın

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