PHP Dosya Yükleme

Hazırlanan web sayfalarına göre kullanıcılar profil resmi yükleme veya dosya yükleme ihtiyacı duyabilir.

PHP ile dosya yükleme işlemi kolay bir şekilde yapılır.

Ancak yüklenen dosyanın boyutunu kontrol etme, isim değiştirme ve php ayarlarının bulunduğu (php.ini) dosyadaki yükleme sınırı gibi dikkat edilmesi gereken konular olabilir.

PHP ayarlarının yapılması

Dosya yükleme işlemi için öncelikle php ayarlarının (phpinfo() fonksiyonu ile) kontrol edilmesi faydalı olacaktır.

Dosya yükleme işleminin yapılması için file_uploads değerinin “On” olması gerekir.

file_uploads = On

Yüklenecek dosyanın boyut sınırı ile ilgili ayarlar için upload_max_filesize / post_max_size değerinin dikkatli bir şekilde belirlenmesi önemlidir.

upload_max_filesize = 64M

Dosya yükleme işlemi sırasında dosyanın geçici kaydedildiği yer upload_tmp_dir değeri ile belirlenir.

upload_max_filesize = ""

Gerekli ayarların kontrolü yükleme sırasında oluşabilecek hataları en aza indirecektir.

Dosya yükleme formu

Dosya yükleme işlemlerinde dikkat edilmesi gereken diğer bir konu ise formun hazırlanmasıdır.

<form action="yukle.php" method="post" enctype="multipart/form-data">
    Yüklenecek dosyayı seçin:
    <input type="file" name="dosya" />
    <input type="submit" value="Yükle" />
</form>

NOT: Örnek formdaki method değerinin post, ayrıca enctype değerinin multipart/form-data olduğuna dikkat edin.

PHP dosya yükleme

Dosya yükleme işlemi form ile yapıldığından PHP isset fonksiyonu ile dosyanın gönderilip gönderilmediğini kontrol etmek faydalı olacaktır.

Aşağıdaki komutları dosya yükleme formundaki action değerindeki dosya ismine (yukle.php) göre kaydedin.

<?php

if ($_FILES["dosya"]) {

  echo "Dosya gönderildi";

} else {

  echo "Lütfen bir dosya seçin";

}

?>

Burada dikkat edilmesi gereken yer dosya yükleme işlemi için $_FILES global dizisinin kullanıldığıdır. Dizi ayrıca yüklenen dosya ile ilgili bilgileri tutar.

<?php

if ($_FILES["dosya"]) {

  echo "<pre>";

  print_r($_FILES);

  echo "</pre>";

} else {

  echo "Lütfen bir dosya seçin";

}

?>

Dizi değerindeki name değeri dosyanın adını, type değeri dosya tipini (MIME), tmp_name değeri dosyanın geçici yolunu/adını, error varsa hata kodunu, size değeri ise yüklenen dosyanın boyutunu byte olarak verir.

Dizi içerisindeki değerler kullanılarak yükleme sınırı koyulabilir, dosya yükleme sorunu bulunabilir veya izin verilecek dosya türü belirlenebilir.

Aşağıdaki örnek herhangi bir kontrol yapılmadan seçilen dosyanın aynı klasöre yüklenmesini sağlar.

<?php

if ($_FILES["dosya"]) {

  $sonuc = move_uploaded_file($_FILES["dosya"]["tmp_name"], $_FILES["dosya"]["name"]);

  echo $sonuc ? "Dosya başarıyla yüklendi" : "Hata oluştu";

} else {

  echo "Lütfen bir dosya seçin";

}

?>

Dosyalar genellikle farklı bir bölüme (dosyalar, uploads vb.) yüklenir.

<?php

if ($_FILES["dosya"]) {

  $yol = "dosyalar"; # Yüklenecek klasör / dizin

  $yuklemeYeri = __DIR__ . DIRECTORY_SEPARATOR . $yol . DIRECTORY_SEPARATOR . $_FILES["dosya"]["name"];

  $sonuc = move_uploaded_file($_FILES["dosya"]["tmp_name"], $yuklemeYeri);

  echo $sonuc ? "Dosya başarıyla yüklendi" : "Hata oluştu";

} else {

  echo "Lütfen bir dosya seçin";

}

?>

NOT: Yükleme işlemi, klasörün olmaması veya yanlış yazılması hataya neden olur.

Benzer isimli dosya yüklendiğinde önceki dosya silinecek yeni dosya eklenecektir.

Bu durumun önüne geçmek için dosya kontrolü veya dosya isim değiştirme işlemi yapılabilir.

<?php

if ($_FILES["dosya"]) {

  $yol = "dosyalar";

  $yuklemeYeri = __DIR__ . DIRECTORY_SEPARATOR . $yol . DIRECTORY_SEPARATOR . $_FILES["dosya"]["name"];

  if ( file_exists($yuklemeYeri) ) {  # Dosya kontrolü

      echo "Dosya daha önceden yüklenmiş";

  } else {

      $sonuc = move_uploaded_file($_FILES["dosya"]["tmp_name"], $yuklemeYeri);

      echo $sonuc ? "Dosya başarıyla yüklendi" : "Hata oluştu";

  }

} else {

  echo "Lütfen bir dosya seçin";

}

?>

Dosya isim değiştirme işlemi için sadece $yuklemeYeri değerinin değiştirilmesi yeterli olacaktır.

<?php

if ($_FILES["dosya"]) {

  $yol = "dosyalar";

  $yuklemeYeri = __DIR__ . DIRECTORY_SEPARATOR . $yol . DIRECTORY_SEPARATOR . "yeni-dosya-ismi.". pathinfo($_FILES["dosya"]["name"], PATHINFO_EXTENSION);

  if ( file_exists($yuklemeYeri) ) {

      echo "Dosya daha önceden yüklenmiş";

  } else {

      $sonuc = move_uploaded_file($_FILES["dosya"]["tmp_name"], $yuklemeYeri);

      echo $sonuc ? "Dosya başarıyla yüklendi" : "Hata oluştu";

  }

} else {

  echo "Lütfen bir dosya seçin";

}

?>

Dosya yükleme sırasında dosya boyutunun kontrol edilmesi yüksek boyutlu dosyaların yüklenmesini önleyecektir.

<?php

if ($_FILES["dosya"]) {

  $yol = "dosyalar";

  $yuklemeYeri = __DIR__ . DIRECTORY_SEPARATOR . $yol . DIRECTORY_SEPARATOR . $_FILES["dosya"]["name"];

  if ( file_exists($yuklemeYeri) ) {

      echo "Dosya daha önceden yüklenmiş";

  } else {

      if ($_FILES["dosya"]["size"]  > 1000000) { # 1 MB dosya sınırı

          echo "Dosya boyutu sınırı";

      } else {

      $sonuc = move_uploaded_file($_FILES["dosya"]["tmp_name"], $yuklemeYeri);

      echo $sonuc ? "Dosya başarıyla yüklendi" : "Hata oluştu";

      }

  }

} else {

  echo "Lütfen bir dosya seçin";

}

?>

Dosya yükleme sırasında sadece belirli uzantılı dosyaların yüklenmesi istenebilir.

<?php

if ($_FILES["dosya"]) {

  $yol = "dosyalar";

  $yuklemeYeri = __DIR__ . DIRECTORY_SEPARATOR . $yol . DIRECTORY_SEPARATOR . $_FILES["dosya"]["name"];

  if ( file_exists($yuklemeYeri) ) {

      echo "Dosya daha önceden yüklenmiş";

  } else {

      if ($_FILES["dosya"]["size"]  > 1000000) {

          echo "Dosya boyutu sınırı";

      } else {

          $dosyaUzantisi = pathinfo($_FILES["dosya"]["name"], PATHINFO_EXTENSION);

          if ($dosyaUzantisi != "jpg" && $dosyaUzantisi != "png") { # Dosya uzantı kontrolü

              echo "Sadece jpg ve png uzantılı dosyalar yüklenebilir.";

          } else {

              $sonuc = move_uploaded_file($_FILES["dosya"]["tmp_name"], $yuklemeYeri);

              echo $sonuc ? "Dosya başarıyla yüklendi" : "Hata oluştu";

          }

      }

  }

} else {

  echo "Lütfen bir dosya seçin";

}

?>

Dosya yükleme kontrollerinin daha detaylı olması oluşabilecek hataları ve siteye komut enjekte edilmesini önleyecektir.

PHP Derslerine buradan ulaşabilirsiniz…

Hayırlı günler dilerim.

Yusuf SEZER

Yusuf SEZER

Computer Engineer who interested about web technologies, algorithms, artificial intelligence and embedded systems; constantly exploring new technologies.


Bunlara'da bakmalısın!