Merhaba arkadaşlar bu yazım da PHP ile dosya yükleme işleminden bahsedeceğim.

Bu konudan bahsederken öncelikle bir form oluşturacağız daha sonra bu form üzerinden gelen dosya verilerine nasıl ulaşacağımızı konuşacağız ve bu ulaştığımız veriler üzerinde gerekli kontrolleri yaptıktan sonra dosya yükleme işlemini gerçekleştireceğiz.

Form Oluşturma

Form oluşturma kısmı aslında bu işin en temel kısmı tipi file olan bir inputumuzun olması ve form taglerinin içine de bir dosya yükleneceğini belirtmek olucak.

<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" id="">
  </div>
  <div>
    <input type="submit" value="Gönder">
  </div>
</form>

şeklinde bir form dosyamız vardır. Burada dosya yükleme işlemini yapmak için önemli olan kısım enctype=”multipart/form-data” kısmıdır. gonder.php dosyamıza ise şimdilik şu kodları yazalım.

PHP Dosyası (gonder.php)

<?php 
    print_r($_FILES);
?>

bu bir dosya seçip gönderdiğimiz zaman karşımıza şöyle bir ekran çıkacaktır.

şimdi bu dizideki elemanları anlatmak gerekirse

  • name: Yüklenen dosyanın adı
  • type: Yüklenen dosyanın mime tipi
  • tmp_name: Yüklenen dosyanın sunucu içinde ki geçici dizini
  • error: Yüklenen dosya da olan hatalar
  • size: Yüklenen dosyanın boyutu

Bizim öncelikle kontrol etmemiz gereken şey yüklenen dosyanın varlığı olmalı eğer oluşturduğumuz FORM’a dosya seçmeden Gönder butonuna basarsanız error kısmının 4 olduğunu görürsünüz. Bu da bize eğer 4 adet hatamız var ise dosya yüklenmemiş demektir.

Yapacağımız ilk kontrol o zaman gönderilen dosyanın varlığı olmalı

if($_FILES['dosya']['error'] == 4){
        $msg = 'Lütfen bir dosya seçiniz';
}

Şimdi bunu kontrol ettik ama yüklenen dosya da herhangi bir hata varsa bu hine bizim için bir problem demektir. Bu yüzden hatanın 0 olmadığı durumlar için de bir mesaj vermeliyiz.

else if($_FILES['dosya']['error'] != 0){
        $msg = 'Yüklemeye çalıştığınız dosya da bir hata vardır!';
}

Burada da yukarıda bahsettiğim durumun kontrolünü gerçekleştirdim. Eğer yüklenen dosya da bir hata var ise direkt olarak bize bir hata vericek.

Yüklenen dosyanın varlığını ve ya hatalı olup olmadığını kontrol ettik şimdi ise dosya gerçekten sisteme geçici olarak yüklenmiş mi ? sorusuna cevap vermemiz gerekiyor. Bunun için

else if(!is_uploaded_file($_FILES['dosya']['tmp_name'])){
        $msg = 'Dosya sisteme yüklenirken bir hata oluştu!';
}

şeklinde ki kodu başladığımız if bloğuna eklememiz gerekiyor. Bundan sonra kalan kontrollerimiz ise tip kontrolü, boyut kontrolü olacaktır. Tip kontrolü için devam etmeden önce MIME Tipleri (MIME TYPES) Nedir ? Ne İşe Yarar ? adlı yazımı okumanızı öneririm

else{
        $gecerli_uzantilar = [
            'image/png',
            'image/jpeg',
            'image/gif'
        ];

        if(!in_array($_FILES['dosya']['type'],$gecerli_uzantilar)){
            $msg = 'Lütfen geçerli uzantıda bir dosya gönderiniz'
        }
    }

Burada ki kodumuzda öncelikle bir dizi oluşturduk ve bizim sistemimize yüklenmesini beklediğimiz dosya tiplerinin mime tiplerini girdik daha sonra in_array fonksiyonu ile bu dizi içinde olup olmadığını kontrol ettik başına ünlem (!) işareti koyarak da eğer yoksa bir mesaj vermesini sağladık. Şimdi ise dosya boyutunu kontrol etmemiz gerekiyor.

        $gecerli_uzantilar = [
            'image/png',
            'image/jpeg',
            'image/gif'
        ];

        $maksimumBoyut = (1024 * 1024) * 3;

        if(!in_array($_FILES['dosya']['type'],$gecerli_uzantilar)){
            $msg = 'Lütfen geçerli uzantıda bir dosya gönderiniz!'
        }else if($_FILES['dosya']['size'] > $maksimumBoyut){
            $msg = 'Yüklemeye çalıştığınız dosyanın boyutu çok büyük en fazla 3 MB bir dosya yükleyebilirsiniz!';
        }

Bu kontrolü yapmak için else bloğumuza öncelikle bir maksimumBoyut adlı bir değişken tanımladım içine 3 mb’a denk gelicek değeri atadım daha sonra yüklemeye çalıştığımız dosyanın boyutu maksimum boyutumuzdan büyük ise bir hata mesajı vermesini sağladık. Bu kontrolü de yaptığımıza göre artık yapabileceğimiz bir kontrol kalmadı artık dosyamızı istediğimiz dosyaya taşıma zamanı geldi.

else{
    $upload = move_uploaded_file($_FILES['dosya']['tmp_name'],  $_FILES['dosya']['name']);

            if($upload){
                $msg = 'Dosya yüklendi';
            }else{
                $msg = 'Dosya yüklenemedi';
            }

        }

Burada ise önce upload değişkenine move_uploaded_file dosyası ile geçici dizin de olan dosyamızı, sistemimizin ana klasörüne taşımasını sağladık ve daha sonra ise if bloğun da bu işlemin gerçekleşip gerçekleşmediğini kontrol ettik. En son olarak da eğer bir mesaj varsa bu mesajı ekrana yazdırması için bir satır kod daha eklememiz gerekiyor.

echo isset($msg) ?  $msg : "Herhangi bir mesaj yoktur. Dosya yükleme işlemi gerçekleşmedi";

Burada ise $msg adında bir değişkenimiz olup olmadığını kontrol ettik eğer var ise bu değişkenin içinde yazanı ekrana yazdırmasını yoksa ise herhangi bir mesaj olmadığını ve dosya yükleme işleminin başarısız olduğunu belirten mesajı ekrana yazdırmasını istedik.

Sonuç olarak gonder.php dosyamızın son hali şu şekildedir

<?php 
    print_r($_FILES);

    if($_FILES['dosya']['error'] == 4){
        $msg = 'Lütfen bir dosya seçiniz';
    }else if($_FILES['dosya']['error'] != 0){
        $msg = 'Yüklemeye çalıştığınız dosya da bir hata vardır!';
    }else if(!is_uploaded_file($_FILES['dosya']['tmp_name'])){
        $msg = 'Dosya sisteme yüklenirken bir hata oluştu!';
    }else{
        $gecerli_uzantilar = [
            'image/png',
            'image/jpeg',
            'image/gif'
        ];

        $maksimumBoyut = (1024 * 1024) * 3;

        if(!in_array($_FILES['dosya']['type'],$gecerli_uzantilar)){
            $msg = 'Lütfen geçerli uzantıda bir dosya gönderiniz!';
        }else if($_FILES['dosya']['size'] > $maksimumBoyut){
            $msg = 'Yüklemeye çalıştığınız dosyanın boyutu çok büyük en fazla 3 MB bir dosya yükleyebilirsiniz!';
        }else{
            $upload = move_uploaded_file($_FILES['dosya']['tmp_name'],  $_FILES['dosya']['name']);

            if($upload){
                $msg = 'Dosya yüklendi';
            }else{
                $msg = 'Dosya yüklenemedi';
            }

        }
    }


    echo isset($msg) ?  $msg : "Herhangi bir mesaj yoktur. Dosya yükleme işlemi gerçekleşmedi";

?>

Eğer dosya yükleme işlemini bir çok form üzerinde yapıyorsak sizlere bunu bir fonksiyona çevirmenizi öneririm.

Özet,

Bu yazımda sizlerle aslında bir dosya yükleme uygulaması yaptık. Bu işlemi yapabilmek için basit bir form oluşturduk. Gerekli form elemanını ve formun başına eklememiz gereken ufak bir koddan bahsettik. Daha sonra dosya yükleme işlemi ile elimize ulaşan diziyi gösterdik ve neleri hangi sırayla kontrol etmemiz gerektiğini ve bu kontrollerin nasıl yapılacağından bahsettik ve aslında basit bir dosya yükleme formu ile dosya yükleme uygulaması kodladık sizinle.

Bir sonraki yazım da PHP ile nasıl çoklu dosya yükleme işlemi yapacağımızdan bahsedeceğim. O zamana kadar diğer PHP yazılarımı okumak için buraya tıklayınız.