Merhaba arkadaşlar bu yazımda sizlere PHP ile çoklu yazı ekleme işleminden bahsedeceğim. Bir önceki yazımda PHP ile Dosya Yükleme işleminden bahsetmiştim fakat burada anlık olarak sadece 1 adet dosya yükleyebiliyorduk. Bu yazımda ise çoklu bir şekilde nasıl bu işlemleri yapabileceğimizden bahsedeceğim.

Öncelikle FORM dosyamızda bir kaç düzenleme yapmamız gerekiyor

<form action="gonder.php" method="POST" enctype="multipart/form-data">
  <div style="padding:10px">
    <label for="dosya">Yüklenecek dosyayı seçiniz:</label>
    <br>
    <input type="file" name="dosya[]" multiple>
  </div>
  <div>
    <input type="submit" value="Gönder">
  </div>
</form>

gonder.php dosyamıza ise sadece şu kodları yazalım ve 2 adet dosya seçip sisteme yüklemeye çalışalım

<?php 
    print_r($_FILES);
?>

2 adet dosya seçip gönderdiğimizde ise karşımıza çıkan sonuç şu şekilde olacaktır.

aslında temel olarak yapacaklarımız normal dosya yüklerken ki ile aynı şeyler fakat her kontrol de bir döngüye girmemiz gerekiyor.

Şimdi sırasıyla yapacağımız kontrollerden bahsetmek gerekirse

  • Hata kontrolü
  • Tip kontrolü
  • Boyut kontrolü

şeklinde 3 adet kontrol noktamız olacak şimdi gonder.php dosyamıza şu kodları eklemeye başlayalım

    $result = [];

    foreach($_FILES['dosya']['error'] as $index => $error ){
        if($error == 4){
            $result['error'] = 'Lütfen dosya seçiniz!';
        }else if($error != 0){
            $result['error'][] = 'Yüklemeye çalıştığınız dosya hatalı #' . $_FILES['dosya']['name'][$index];
        }
    }

burada öncelikle result adında bir dizi tanımladık. Bu dizi aracılığı ile yapılan işlemlerin başarılı ve ya başarısız olduğunu öğreneceğiz ve işlemlerimize devam edeceğiz.

Şimdi ise döngü ile neler yaptığımızdan bahsetmek gerekirse foreach döngüsü ile yüklenen dosyaların hatalarını kontrol etmeye başladık eğer hata 4’e eşitse herhangi bir dosya seçilmemiş oluyordu hatırlıyorsanız. Önce dosya gönderilip gönderilmediğini kontrol ettik daha sonra dosya yüklenmiş ama hine de bir hata olup olmadığını kontrol ettik. Hata varsa result dizimizin içinde ki error adlı indise olan problemi ve hangi dosya da bu problemin olduğunu söyleyecek şekilde yerleştirdik.

Şimdi sıradaki kontrolümüz ise dosya boyutları bu kısma başlamadan önce MIME Tipleri hakkında ki yazımı okumanızı öneririm

        if(!isset($result['error'])){
        $gecerli_uzantilar = [
            'image/png',
            'image/jpeg',
            'image/gif'
        ];

        foreach($_FILES['dosya']['type'] as $index => $type){
            if(!in_array($type,$gecerli_uzantilar)){
                $result['error'][] = 'Sadece PNG, JPG/JPEG, GIF formatında dosya uzantıları desteklenmektedir #' . $_FILES['dosya']['name'][$index];
            }

          //buradan devam edicek  

        }
    }

Burada ise önce gecerli_uzantilar adında tanımladığım diziyi gönderilen tüm dosyaların tipleri ile karşılaştırarak bir sorun olup olmadığını tespit ettik.

Dosyaları sisteme tamamen yüklemeden önce en son yapacağımız kontrol ise boyutları olucak

if(!isset($result['error'])){
   $maxSize = (1024 * 1024) * 3;

   foreach($_FILES['dosya']['size'] as $index => $size){
           if($size > $maxSize){
              $result['error'][] = 'Yüklemeye çalıştığınız dosyanın boyutu çok büyük en fazla 3MB olabilir #' . $_FILES['dosya']['name'][$index];
            }
    }

          //buradan devam edicek

}

burada maxSize adında bir değişkene 3mb’ın sayısal karşılığına eşitledik daha sonra yüklenmiş dosyaların boyutları ile karşılaştırdık burada da bir problem yaşamadıysak artık son bölümümüz olan dosyayı sisteme gerçekten yüklemenin zamanı gelmiş demektir.

            if(!isset($result['error'])){
                foreach($_FILES['dosya']['tmp_name'] as $index => $temp){
                    $upload = move_uploaded_file($temp,  $_FILES['dosya']['name'][$index]);

                    if($upload){
                        $result['success'][] = $_FILES['dosya']['name'][$index];
                    }else{
                        $result['hata'][] = 'Dosya yüklenemedi #' . $_FILES['dosya']['name'][$index];
                    }

                }
            }

burada ise move_uploaded_file fonksiyonu ile yüklenmeye çalışılan tüm dosyaları geçici lokasyonlarından sistemimiz de kalıcı olmak üzere istediğimiz lokasyona taşıdık benim yazdığım kodda gonder.php dosyasının olduğu klasör de. Şimdi ise yazdığımız kodların tamamını görme zamanı

<?php 
    $result = [];

    foreach($_FILES['dosya']['error'] as $index => $error ){
        if($error == 4){
            $result['error'] = 'Lütfen dosya seçiniz!';
        }else if($error != 0){
            $result['error'][] = 'Yüklemeye çalıştığınız dosya hatalı #' . $_FILES['dosya']['name'][$index];
        }
    }

    if(!isset($result['error'])){
        $gecerli_uzantilar = [
            'image/png',
            'image/jpeg',
            'image/gif'
        ];

        foreach($_FILES['dosya']['type'] as $index => $type){
            if(!in_array($type,$gecerli_uzantilar)){
                $result['error'][] = 'Sadece PNG, JPG/JPEG, GIF formatında dosya uzantıları desteklenmektedir #' . $_FILES['dosya']['name'][$index];
            }
        }

        if(!isset($result['error'])){
            $maxSize = (1024 * 1024) * 3;

            foreach($_FILES['dosya']['size'] as $index => $size){
                if($size > $maxSize){
                    $result['error'][] = 'Yüklemeye çalıştığınız dosyanın boyutu çok büyük en fazla 3MB olabilir #' . $_FILES['dosya']['name'][$index];
                }
            }

            if(!isset($result['error'])){
                foreach($_FILES['dosya']['tmp_name'] as $index => $temp){
                    $upload = move_uploaded_file($temp,  $_FILES['dosya']['name'][$index]);

                    if($upload){
                        $result['success'][] = $_FILES['dosya']['name'][$index];
                    }else{
                        $result['hata'][] = 'Dosya yüklenemedi #' . $_FILES['dosya']['name'][$index];
                    }

                }
            }

        }

    }

    print_r($result);

?>

Özet,

Bu yazımda PHP ile Çoklu Dosya Yükleme İşleminden bahsettim. Çoklu dosya yükleme işlemi için nasıl bir form oluşturmamız gerektiği yapacağımız kontrolleri nasıl yapacağımızı verilecek hataların nasıl gösterilmesi gerektiğinden bahsettim.

Bir sonraki yazım da tekil dosya yükleme ve çoğul dosya yükleme işlemleri için fonksiyonlar yazarak bu işlemlerin nasıl hızlı bir şekilde gerçekleşeceğinden bahsedeceğim. O zamana kadar diğer PHP yazılarımı okumak için tıklayınız.