Php Dosya Yükleme İşlemi ($_FILES Kullanımı)

Php dosya yükleme konusunda formlar aracılığı ile nasıl dosya yüklendiğinden bahsedeceğim. İnternet yaygınlaştıkça kullanıcılar internet ortamına daha fazla dosya yüklemeye başladı. Bunlara en büyük örneği sosyal medya platformlarını verebiliriz. Gün boyunca milyonlarca dosya kullanıcılar tarafından sosyal medya platformlarına yükleniyor. Artık en basit sitelere bile kayıt olduğunuzda sizden bir profil fotoğrafı yüklemeniz istenebiliyor. Bu gibi durumlarda kullanıcılar formlar aracılığı ile dosyalarını, fotoğraflarını vs. yükleyebiliyorlar. 

Php ile Form Kullanımı konusunda bahsettiğim gibi bir form oluşturmamız gerekiyor. Formun daha düzgün ve güzel görünmesi için Bootstrap 4.3.1 sürümünü kullanarak oluşturacağım. Yazı sonuna isterseniz çalışma dosyalarını indirebileceğiniz bir link bırakacağım.

Php Dosya Yükleme Formu

Formu oluşturmak için ornek.php dosyası oluşturun ve aşağıdaki kodları yazın. Formu Bootstrap Css kütüphanesi ile oluşturduğumuz için düzgün görünmesi için yukarıda verdiğim linkten Bootstrap 4.3.1 sürümünü indirmeniz gerekiyor. 

<!DOCTYPE html>
<html lang="tr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Php Dosya Yükleme</title>
    <link rel="stylesheet" href="bootstrap/css/bootstrap.min.css">
</head>
<body>
<div class="container mt-5">
    <h4>Php Dosya Yükleme</h4>
    <form action="" method="post" enctype="multipart/form-data">
        <div class="custom-file">
            <input type="file" class="custom-file-input" name="dosya">
            <label class="custom-file-label">Dosya Seçin</label>
        </div>
        <button type="submit" class="btn btn-primary mt-2">Yükle</button>
    </form>
</div>
</body>
</html>

Ekran görüntüsü

Yukarıdaki HTML kodları ile aşağıdaki formu elde ediyoruz.

Dosya Yükleme FormuPhp dosya yükleme formu oluştururken dikkat etmemiz gereken önemli nokta enctype=”multipart/form-data” eklenmesi. Bu form özelliği eklenmediği taktirde formlar aracılığı ile dosya yükleme işlemi yapılmamaktadır. Dosya yükleme işleminin yapılacağı formda mutlaka enctype=”multipart/form-data” özelliğinin eklenmiş olması gerekiyor.

Php ile Form Kullanımı konusunda verileri elde etmek için $_GET ve $_POST global değişkenlerini kullanmıştık. Eğer formda bir dosya yükleme işlemi yapılıyorsa o dosya ile ilgili değişkenlere ulaşmak için $_FILES global değişkenini kullanmamız gerekmektedir. 

$_FILES Global Değişkeni 

Yukarıda formu oluşturduktan sonra php kodları ile $_FILES global değişkeni ile gönderilen dosyanın erişebileceğimiz özelliklerini görelim.

 <?php
echo "<pre>";
print_r ($_FILES);
echo "</pre>";
?>

Form aracılığıyla bir dosya gönderdiğimizde ekran görüntümüz aşağıdaki gibi olacaktır.

Array
(
    [dosya] => Array
        (
            [name] => list.png
            [type] => image/png
            [tmp_name] => C:\wamp64\tmp\php5B63.tmp
            [error] => 0
            [size] => 1050236
        )

)

Burada 5 adet değerin dizi halinde döndüğünü görüyoruz. Aşağıdaki tabloda bu değerlerin anlamlarını inceleyelim.

Değişken Açıklama
name Yüklenen dosyanın ismidir.
type Yüklenen dosyanın MIME(veri) türünü verir.
tmp_name Yüklenen dosyanın geçici olarak saklandığı dizindir.
error Yükleme işlemi ile ilgili hata kodlarını belirtir. Eğer 0 (sıfır) ise yükleme başarılıdır.
size Yüklenen dosyanın byte cinsinden boyutunu verir.

$_FILES global değişkeni ile dosyanın hangi değişkenlerine erişebileceğimizi gördük. Dosyayı karşıya yükleme işlemini bu değişkenleri kullanarak gerçekleştireceğiz.

Karşıya Dosya Yükleme

Dosyayı karşıya yükleme kodlarını yazmadan önce oluşturduğumuz formdaki file inputunun name değerinin dosya olduğunu gözden kaçırmayın. Form aracılığı ile gönderdiğimiz dosyaya $_FILES global değişkeni ile erişmek için file inputunun name değerini kullanacağız.

Dosyanın karşıya yüklenmesi işlemi için aşağıdaki kodları </form> bitiş etiketinin altına yazalım. Bu kodları istediğiniz yere yazabilirsiniz ancak bu şekilde mesaj kutuları daha düzgün görüntülendiği için ben böyle kullandım.

<?php
 if($_FILES["dosya"]["name"]){
  $yuklenecek_dosya = $_FILES["dosya"]["tmp_name"];
  $dosya_ismi = $_FILES["dosya"]["name"];
  if(move_uploaded_file($yuklenecek_dosya, $dosya_ismi)){
    echo '
    <div class="alert alert-success mt-2" role="alert">
    Dosya karşıya yüklendi!
    </div>
    ';
  }else{
    echo '
    <div class="alert alert-danger mt-2" role="alert">
    Dosya yüklenemedi!
    </div>
    ';
  }
 }
?>

Yüklenen dosya yükleme işlemi oluşturduğunuz php dosyası ile aynı dizine yüklenecektir. Yukarıdaki kodlar incelendiğinde ve test edildiğinde kullanıcı istediği her türlü dosyayı bu form aracılığı ile karşı sunucuya yükleyebilecektir.

Dosya Yükleme Başarılı

Ben istiyorum ki kullanıcı sadece fotoğraf formatındaki (png, jpg, jpeg vs.) dosyaları sunucuya yükleyebilsin.

Formatına Göre Php Dosya Yükleme

Kullanıcının yükleyeceği dosyanın formatını kısıtlayarak sadece bizim istediğimiz türde dosya yüklemesini sağlayabiliriz. Formumuz yine en baştaki form ile aynı olacak herhangi bir değişiklik olmayacak.

Yükleme işlemi sırasında bir karar yapısı daha oluşturacağız ve kullanıcının yüklemek istediği dosyanın formatını kontrol edeceğiz. Aşağıdaki kodu $dosya_ismi değişkenimizin hemen altına ekleyelim. 

$dosya_uzantilari = array("image/png", "image/jpeg", "image/jpg");

Burada bir dizi oluşturarak yüklenmesine izin vereceğimiz dosyaların uzantılarını saklıyoruz. Şimdi bu dizideki uzantıların dosyanın uzantısı ile aynı olup olmadığını kontrol etmemizi sağlayacak karar yapısını oluşturuyoruz. Yüklenecek dosyanın uzantısı kontrol edeceğimiz için $_FILES[“dosya”][“type”] değerini kullandığımızı gözden kaçırmayın.

if(in_array($_FILES["dosya"]["type"], $dosya_uzantilari)) {
/* kalan kodlar buraya  */
}else{
  echo '
    <div class="alert alert-danger mt-2" role="alert">
    Dosya uzantısı sadece PNG, JPEG, JPG olabilir.
    </div>
    ';
}

Yukarıdaki parça kodları da eklediğimizde tam kodumuz aşağıdaki gibi olacaktır.

if($_FILES["dosya"]["name"]){
  $yuklenecek_dosya = $_FILES["dosya"]["tmp_name"];
  $dosya_ismi = $_FILES["dosya"]["name"];
  $dosya_uzantilari = array("image/png", "image/jpeg", "image/jpg");
  if(in_array($_FILES["dosya"]["type"], $dosya_uzantilari)) {
    if(move_uploaded_file($yuklenecek_dosya, $dosya_ismi)){
      echo '
      <div class="alert alert-success mt-2" role="alert">
      Dosya karşıya yüklendi!
      </div>
      ';
    }else{
      echo '
      <div class="alert alert-danger mt-2" role="alert">
      Dosya yüklenemedi!
      </div>
      ';
    }
  }else{
    echo '
      <div class="alert alert-danger mt-2" role="alert">
      Dosya uzantısı sadece PNG, JPEG, JPG olabilir.
      </div>
      ';
  }
}

Dosya Uzantısı Hatalı

Kullanıcı istediğimiz uzantıdaki dosyayı yüklediği ama kullanıcının yüklediği fotoğrafların çözünürlüğü çok yüksek olduğu için sunucumuzda çok fazla yer kaplıyor ve sunucumuzun depolama alanı gereksiz şişiyor. Bu sorunu önlemek için kullanıcının yükleyeceği dosyaların boyutunu sınırlayabiliriz.

Boyutunu Göre Php Dosya Yükleme

Yukarıdaki kodların üzerinden devam ederek dosya boyutunu sınırlamayı anlatacağım. Genelde sunucu firmaları php’de karşıya dosya yükleme işlemini sınırlandırırlar. Bu sınırı kaldırmak bazı yöntemlerle mümkündür. Şimdi konumuza devam edelim biz farz edelim ki bu formdan kullanıcı en fazla 1mb boyutunda dosya yükleyebilsin. İlk yapmamız gereken maksimum dosya boyutunu bir değişkene atamak.

$maksimum_boyut = 1024*1000; /* 1024B * 1024 = 1024 KB */

Burada maksimum boyut adında bir değişken tanımladım. Boyut hesaplama yaparken mantık 1024B = 1KB olduğundan 1024B * 1024 bize 1024KB verir. Burada 1024KB = 1MB olduğu için kodumuz doğru çalışır. Maksimum dosya boyutumuzu bir değişkene atadıktan sonra karar yapısı kullanarak, kullanıcının göndermiş olduğu dosyanın boyutunu oluşturduğumuz maksimum boyut değişkeni ile karşılaştırmamız gerekiyor.

if($_FILES["dosya"]["size"] < $maksimum_boyut){
/* DOSYA BOYUTU 1MB'DEN KÜÇÜK İSE İŞLEM BURADAN DEVAM EDECEK */
}else{
echo '
<div class="alert alert-danger mt-2" role="alert">
Dosya boyutu en fazla 1MB olabilir.
</div>
';
}

Parça kodları birleştirdiğimizde tam kodumuz aşağıdaki gibi olacaktır.

if($_FILES["dosya"]["name"]){
  $yuklenecek_dosya = $_FILES["dosya"]["tmp_name"];
  $dosya_ismi = $_FILES["dosya"]["name"];
  $dosya_uzantilari = array("image/png", "image/jpeg", "image/jpg");
  $maksimum_boyut = 1024*1000; /* 1024B * 1024 = 1024 KB */
  if($_FILES["dosya"]["size"] < $maksimum_boyut){
    if(in_array($_FILES["dosya"]["type"], $dosya_uzantilari)) {
      if(move_uploaded_file($yuklenecek_dosya, $dosya_ismi)){
        echo '
        <div class="alert alert-success mt-2" role="alert">
        Dosya karşıya yüklendi!
        </div>
        ';
      }else{
        echo '
        <div class="alert alert-danger mt-2" role="alert">
        Dosya yüklenemedi!
        </div>
        ';
      }
    }else{
      echo '
        <div class="alert alert-danger mt-2" role="alert">
        Dosya uzantısı sadece PNG, JPEG, JPG olabilir.
        </div>
        ';
    }
  }else{
    echo '
        <div class="alert alert-danger mt-2" role="alert">
        Dosya boyutu en fazla 1MB olabilir.
        </div>
        ';
  }
}

Php programlama dilinde formlar aracılığı ile dosya yükleme işlemi yukarıdaki gibidir. Dosya yükleme işlemi için hazır sınıflarda vardır. İlerleyen konularda Php Uygulamalar kategorisi altında bununla ilgili örnekler olacak. 

Aşağıdaki iki .rar dosyasını yerel sunucuda aynı dizine çıkartın.

Çalışma dosyalarını indirmek için tıklayın.

Bootstrap 4.3.1 indirmek için tıklayın.

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir