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.