POST yöntemi ile karşıya dosya yükleme
   
    Bu özellik metin ve ikil dosyaları yükleme imkanı verir. PHP'nin kimlik
    doğrulama ve dosya işletim işlevleri ile kimin karşıya dosya yükleme
    yetkisi olacağına ve yüklenen dosya ile ne yapılacağı hakkında tam
    denetime sahip olursunuz.
   
   
    PHP, herhangi bir RFC 1867 uyumlu tarayıcıdan gelen dosya yüklemelerini
    alabilir.
   
   Bilginize: 
    İlgili Yapılandırmalar
    
     Ayrıca php.ini içindeki
     file_uploads,
     upload_max_filesize,
     upload_tmp_dir,
     post_max_size ve
     max_input_time yönergelerine
     bakınız.
    
   
   
    PHP ayrıca Netscape Composer ve W3C'nin
    Amaya istemcileri tarafından kullanılan
    PUT yöntemiyle dosya yüklemeleri de destekler. Ayrıntılı bilgi için
    PUT Yöntemi
    Desteği'ne bakınız.
   
   
    
     Örnek 1 - Karşıya Dosya Yükleme Formu
     
      Bir dosya yükleme ekranı aşağıdaki gibi özel bir form ile
      oluşturulabilir:
     
<!-- Veri kodlama türü, enctype, aşağıdaki gibi belirtilmek ZORUNDADIR -->
<form enctype="multipart/form-data" action="__URL__" method="POST">
    <!-- MAX_FILE_SIZE dosya giriş alanından önce bulunmak zorundadır -->
    <input type="hidden" name="MAX_FILE_SIZE" value="30000" />
    <!-- input elemanının adı $_FILES dizisinin içindeki ismi belirler -->
    Bu dosyayı gönder: <input name="kullanici_dosyasi" type="file" />
    <input type="submit" value="Dosyayı Gönder" />
</form>
 
     
      Yukarıdaki örnekteki __URL__ bir PHP dosyası ile
      değiştirilmelidir.
     
      MAX_FILE_SIZE gizli alanı (bayt cinsinden) dosya
      giriş alanından önce bulunmak zorundadır ve değeri PHP tarafından kabul
      edilecek azami dosya boyutudur. Bu form elemanı azami-büyüklüğü aşan bir
      dosyanın gönderilmesini baştan engelleyeceği için büyük dosyaları boşuna
      beklememek açısından kullanıcılara zaman kazandırır; bu nedenle her
      zaman kullanılmalıdır. Ancak unutmayın: Bu ayarı tarayıcı tarafında
      devre dışı bırakmak oldukça kolaydır, bu nedenle daha büyük boyuttaki
      dosyaların bu özellik tarafından engelleneceğine güvenmeyiniz. Bunula
      birlikte, PHP'nin azami-büyüklük ayarı devre dışı bırakılamaz.
     
 
   
   Bilginize: 
    
     Dosya yükleme formunuzun enctype="multipart/form-data"
     özniteliğine sahip olduğundan emin olun, aksi takdirde dosya yükleme
     çalışmaz.
    
   
   
    Küresel $_FILES karşıdan yüklenen tüm dosyaların
    bilgisini içerir. Örnek formdaki $_FILES içeriği aşağıda
    verilmiştir. Yukarıdaki örneğe göre yüklenen dosya adı
    kullanici_dosyasi'dır. Bu herhangi bir isim olabilir.
    
     
      - $_FILES['kullanici_dosyasi']['name']
- 
       
        İstemci makinasındaki asıl dosya adıdır.
        
- $_FILES['kullanici_dosyasi']['type']
- 
       
        Eğer tarayıcı bu bilgiyi sağladıysa dosyanın MIME türüdür.
        Örneğin, "image/gif". Bu MIME türü PHP tarafında
        denetlenmez; bu bakımdan bu değeri dikkate almayın.
 
- $_FILES['kullanici_dosyasi']['size']
- 
       
        Yüklenen dosyanın bayt cinsinden boyutudur.
        
- $_FILES['kullanici_dosyasi']['tmp_name']
- 
       
        Yüklenen dosyanın sunucuda saklandığı sıradaki geçici dosya adıdır.
        
- $_FILES['kullanici_dosyasi']['error']
- 
       
        Bu dosya yüklemesiyle ilişkili
        hata kodudur.
        
- $_FILES['kullanici_dosyasi']['full_path']
- 
       
        Tam dosya yolu (full_path) tarayıcı tarafından gönderilir. Bu yol
        her zaman gerçek dizin yapısını içermediğinden güvenilmemelidir.
        PHP 8.1.0 ve sonrasında kullanılabilir.
        
    php.ini içindeki
    upload_tmp_dir yönergesi ile
    başka bir yer belirtilmediyse, dosyalar, öntanımlı olarak sunucunun
    öntanımlı geçici dizininde saklanır. Sunucunun öntanımlı geçici dizini
    PHP'nin içinde çalıştığı ortamdaki TMPDIR ortam değişkenine
    başka bir değer vererek değiştirilebilir. Buna PHP betiği içinden
    putenv() işlevi ile değer verirseniz çalışmaz. Bu ortam
    değişkeni diğer işlemlerin yüklenen dosyalar üzerinde çalıştığından emin
    olmak için de kullanılabilir.
    
     Örnek 2 - Dosya yüklemelerinin doğrulanması
     
      Daha fazla bilgi için is_uploaded_file() ve
      move_uploaded_file() işlev girdilerine de bakınız.
      Aşağıdaki örnek bir formdan gelen dosya yükleme isteğini işleyecektir.
     
<?php
$dizin = '/var/siteler/uploads/';
$yuklenecek_dosya = $dizin . basename($_FILES['kulldosyasi']['name']);
echo '<pre>';
if (move_uploaded_file($_FILES['kulldosyasi']['tmp_name'], $yuklenecek_dosya))
{
    echo "Dosya geçerli ve başarıyla yüklendi.\n";
} else {
    echo "Olası dosya yükleme saldırısı!\n";
}
echo 'Diğer hata ayıklama bilgileri:';
print_r($_FILES);
print "</pre>";
?>
      
     
   
   
    Yüklenen dosyayı alan PHP betiği yüklenen dosya ile ne yapılacağını
    belirlemek için gerekli mantığı uygulamalıdır. Örneğin,
    $_FILES['kullanici_dosyasi']['size'] değişkenini çok
    küçük ve büyük dosyaları engellemek için kullanabilirsiniz.
    $_FILES['kullanici_dosyasi']['type'] değişkenini
    belirli türlere uymayan dosyaları engellemek için kullanabilirsiniz,
    fakat bunu sadece birincil denetimlerde kullanın, çünkü bu değer tamamen
    istemci kontrolündedir ve PHP tarafında denetlenmez. Ayrıca $_FILES['kullanici_dosyasi']['error']
    kullanabileceği gibi mantığınızı da
    hata kodlarına göre
    planlayabilirsiniz. Her şartta dosyayı ya geçici dizinden silmeli ya da
    başka bir yere taşımalısınız.
   
   
    Eğer formunuzda yüklemek için bir dosya seçilmediyse, PHP
    $_FILES['kullanici_dosyasi']['size'] değerini 0 ve
    $_FILES['kullanici_dosyasi']['tmp_name'] değerini boş
    döndürür.
   
   
    İstemin sonunda dosya başka bir yere taşınmadı veya adı değiştirilmediyse
    geçici dizinden silinir.
   
    
     Örnek 3 - Dosya dizisi yükleme
     
      PHP HTML dizisi özelliğini
      dosyalar için de destekler.
     
<form action="" method="post" enctype="multipart/form-data">
<p>Resimler:
<input type="file" name="resimler[]" />
<input type="file" name="resimler[]" />
<input type="file" name="resimler[]" />
<input type="submit" value="Gönder" />
</p>
</form>
 
     
<?php
foreach ($_FILES["resimler"]["error"] as $anahtar => $hata) {
    if ($hata == UPLOAD_ERR_OK) {
        $tmp_name = $_FILES["resimler"]["tmp_name"][$anahtar];
        $name = $_FILES["resimler"]["name"][$anahtar];
        // basename() dosya sisteminin geçiş saldırılarını engelleyebilir;
        // dosya adının daha fazla doğrulanması/temizliği uygun olabilir
        $name = basename($_FILES["resimler"]["name"][$anahtar]);
        move_uploaded_file($tmp_name, "data/$name");
    }
}
?>
      
     
   
    Dosya yükleme ilerleme çubuğu
    Dosya Yüklemeyi İzleme
    seçeneği kullanılarak gerçeklenebilir.