PHP Çoklu Resim Upload ve Boyutlandırma

Cryptograph 14.07.201410:46 PHP & MySQL 6619    
Facebookta Paylaş

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.

Okuyucu Yorumları (2 Yorum)

şenol

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

şenol | 23:11 - 03.01.2017

Cryptograph

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;
        }
    }
}

Cryptograph | 23:32 - 04.01.2017

Söz Sırası Sizde

Benzer Konular

Benzer KonularPaylaşmanın asaletini hiçbir zaman bencilliğin çirkinliğine bırakmayın!

​​​​​​​​​​​​​​​​​​​​​​​​​

MERAK EDİLENLER

İLETİŞİM

  • alpay[at]cryptograph.gen.tr
  • İstanbul ikametgah