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.

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
// 4.1.0'dan önceki PHP sürümlerinde, $_FILES yerine
// $HTTP_POST_FILES kullanılmalıdır.

$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];
        
move_uploaded_file($tmp_name"data/$name");
    }
}
?>

Dosya yükleme ilerleme çubuğu Dosya Yüklemeyi İzleme seçeneği kullanılarak gerçeklenebilir.