Tagphp ile çoklu dosya yükleme

PHP Dosya Yükleme Fonksiyonları

Merhaba arkadaşlar bu yazımda sizlere son iki PHP yazım da bahsetmiş olduğum PHP ile Dosya Yükleme ve PHP ile Çoklu Dosya Yükleme işlemlerinde yazmış olduğumuz kodları bir fonksiyon haline getirip. Bu işlemleri kolaylaştıracağız.

PHP ile Dosya Yükleme (Tek Dosya) Fonksiyonu

Evet şimdi fonksiyonumuzun kodlarını sizlerle paylaşacağım

    function single_upload($file,$gecerli_uzantilar,$maxBoyut){
        
        $result;
        
        if($file['error'] == 4){
            $result = 'Lütfen bir dosya seçiniz!';
        }else if($file['error'] != 0){
            $result = 'Yüklemeye çalıştığınız dosya da hata var';
        }else if(!is_uploaded_file($file['tmp_name'])){
            $result = 'Yüklemeye çalıştığınız dosya sisteme yüklenirken bir hata oluştu lütfen tekrar deneyiniz!';
        }else{
            if(!in_array($file['type'],$gecerli_uzantilar)){
                $result = 'Lütfen geçerli uzantıda bir dosya yükleyiniz!';
            }else{
                if($file['size'] > $maxBoyut){
                    $result = 'Yüklemeye çalıştığınız dosyanın boyutu çok büyük!';
                }else{
                    $upload = move_uploaded_file($file['tmp_name'], 'upload/' . $file['name']);

                    if($upload){
                        $result = 1;
                    }else{
                        $result = 'Yüklemeye çalıştığınız dosya sisteme yüklenirken bir hata oluştu lütfen tekrar deneyiniz!';
                    }

                }
            }


        }

        return $result;
    }

Burada yapmanız 3 parametresi olan bir fonksiyon yazdık fonksiyon içerisinde yapılan kontrolleri PHP ile Dosya Yükleme İşlemi adlı yazımdan detaylı bir şekilde öğrenebilirsiniz. Eğer dosya yükleme işlemi başarılı ise fonksiyon 1 değerini döndürüyor eğer başarılı değilse sorunun nereden kaynaklandığı hakkında bize bilgi veriyor. Fonksiyona göndermemiz gereken parametreler $_FILES[name], gecerli boyutlarımızın olduğu bir dizi ve dosyamızın olması gereken maksimum boyut.

PHP ile Çoklu Dosya Yükleme Fonksiyonu

    function multi_upload($files,$gecerli_uzantilar,$maxBoyut){
        $result = [];

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

        if(!isset($result['error'])){
            
            foreach($files as $index => $type){
                if(!in_array($type,$gecerli_uzantilar)){
                    $result['error'][] = 'Yüklemeye çalıtşığınız dosya geçerli uzantıda değil #' . $files['name'][$index];
                }
            }

            if(!isset($result['error'])){
                foreach($files['size'] as $index => $size){
                    if($size > $maxBoyut){
                        $result['error'][] = 'Yüklemeye çalıştığınız dosyanın boyutu çok büyük #' . $files['name'][$index];
                    }
                }

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

                        if($upload){
                            $result['success'][] = 'Dosya başarılı ile yüklendi #' . $files['name'][$index];
                        }else{
                            $result['error'][] = 'Dosya taşınamadı #' . $files['name'][$index];
                        }

                    }
                }

            }


        }

        return $result;

    }

Bu fonksiyonumuzda ilk fonksiyon gibi 3 parametre alıyor. İlk parametresi $_FILES değişkeni, ikinci parametre geçerli uzantıların olduğu bir dizi ve üçüncü parametre ise yüklenen dosyaların olabileceği maksimum boyut olacak şekilde ayarlamanız gerekiyor. Bu fonksiyon sonuç olarak bir dizi döndürüyor ve işlemin başarılı olup olmadığını anlamak için bu dizinin error adlı bir indisi olup olmadığını kontrol etmek olacaktır. Ayrıca bu fonksiyon da yapılan kontrollerin detaylı anlatımları ise PHP ile Çoklu Dosya Yükleme adlı yazımı inceleyerek görebilirsiniz.

Özet,

Bu yazımda sizlere PHP ile Dosya Yükleme işlemlerinde fazla satırlardan tasarruf etmeniz amacıyla iki adet fonksiyon paylaştım. Bu fonksiyonlar genel olarak yapılabilecek bir çok kontrolü yaparken hine de daha kompleks sistemler için daha gelişmiş kodlar yazmanız gerekebilir fakat buradaki kodlar ise size bir başlangıç olacaktır.

Bir sonraki PHP yazım da PDO ile Veritabanı işlemleri yapmaya başlayacağız. O zamana kadar PHP hakkında yazmış olduğum yazıları merak ediyorsanız buraya tıklayabilirsiniz.

PHP ile Çoklu Dosya Yükleme

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.