<?php $uploaddir= '/var/www/dosya/';
$uploadfile=$uploaddir.basename($_FILES['userfile']['name']);
if (move_uploaded_file($_FILES['userfile']['tmp_name'], uploadfile)) {
echo 'Dosya yüklemesi sorunsuz bir şekilde yapıldı';
}else {
echo 'Dosya yüklemesinde bir hata var. Hata Kodu:'.$_FILES['userfile']['error'];
}
echo 'Dosya ile ilgili ayrıntılı bilgi :<br>';
print_r($_FILES);
?>
Yukarıdaki kod ile form tarafından gönderilen dosya $uploadfile değişkeninde belirtilen yere kaydedilir. Bunun için kullanılan move_uploaded_file()fonksiyonu iki parametre alır. Birincisi yüklenecek dosya ismidir ve geçici dizine kaydedilen dosya adı ile verilmelidir. (Örneğimizdeki $_FILES[‘userfile’][‘tmp_name’] ). İkinci parametre ise dosyanın kaydedileceği dizindir. move_uploaded_file() dosya yüklemede yada dizine kopyalamada problem olursa False döner. Kopyalama işlemi başarıyla yapıldığında ise True döner. move_uploaded_file() kopyalanmak istenen dosya klasörde var ise bir uyarı vermeden üzerine yazar. Bu fonksiyonu kullanarak sadece PHP aracılığıyla yüklenmiş dosyaları kopyalayabiliriz.
Ek olarak is_uploaded_file() fonksiyonu kullanarak dosyanın POST yöntemiyle yüklenip yüklenmediğini kontrol edebiliriz. Fonksiyon dosya POST yöntemiyle yüklenmişse ve dosya ile ilgili bir güvenlik problemi yoksa True döner. Dosya yüklerken güvenlik kontrolu için bu dosya da kullanılmalıdır. Dosyanın sunucudaki geçici ismini $_FILES[‘userfile’][‘tmp_name’] arguman olarak alır.
<?php
$uploaddir= '/var/www/dosya/';
$uploadfile = $uploaddir.basename($_FILES['userfile']['name']);
if(is_uploaded_file($_FILES['userfile']['tmp_name'])) {
if(move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile)) {
echo 'Dosya yüklemesi sorunsunz bir şekilde yapıldı';
}
else {
echo 'Dosya yüklemesinde bir hata var. Hata Kodu :'.$_FILES['userfile']['error'];
}/B>
}
else {
echo 'Dosya yükleme de bir sorun var. Bir saldırı olabilir!';
}
echo 'Dosya ile ilgili ayrıntılı bilgi :<br>';
print_r($_FILES);
?>
Aynı Anda Birden Fazla Dosya Yükleme
PHP ile aynı anda birden fazla dosya yüklenebilir. bunun için dosya yükleme formunun uygun şekilde yapılması gereklidir. Örneğin
<form action='' method='enctype=multipart/form-data'> Resimler: <input type='file' name='pictures[]'> <input type='file' name='pictures[]'> <input type='file' name='pictures[]'> <form>
Form doldurulup gönderildiğinde dosyalara $_FILES
değişkeni kullanarak ulaşabiliriz. Tek dosya yüklemesinden farklı olarak $_FILES[‘pictures’][‘name’],
$_FILES[‘pictures’][‘tmp_name’],
$_FILES[‘pictures’][‘size’]
ve $_FILES[‘pictures’][‘type’] birer dizi (array) olarak oluşturulur.
$_FILES[‘pictures’][‘name’][0] İlk dosyanın adı
$_FILES[‘pictures’][‘name’][1] İkinci dosyanın adı
$_FILES[‘pictures’][‘name’][2] Üçüncü dosyanın adı
$_FILES[‘pictures’][‘size’][0] İlk dosyanın boyutu
$_FILES[‘pictures’][‘size’][1] İkinci dosyanın boytu
$_FILES[‘pictures’][‘size’][0] Üçüncü dosyanın boyutu
Birden çok dosyayı aşağıdakine benzer bir kodla sunucuya yükleyebiliriz.
<?php
foreach($_FILES['pictures']['error'] as $key => $error) {
if($error == UPLOAD_ERR_OK) {
$tmp_name = $_FILES['pictures']['tmp_name'][$key];
$name = $_FILES['pictures']['name'][$key];
move_uploaded_file($tmp_name,$name);
}
}
?>
İpuçları Öneriler
1) Php.ini deki upload_max_filesizebelirterciyle belirtilen boyuttan fazla boyuttaki dosyaları yüklenmeye çalışıldığında hata verir. Bu belirteci ihtiyaca göre ayarlanmalıdır.
2) Php.ini deki post_max_sizebelirtecinin değeri de dosya yüklemeleri etkiler. upload_max_filesizedeğeri post_max_size değerinden büyükse boyutu post_max_size değerinden büyük dosyalar yüklenirken hata verir.
3) Yüklenen dosya türlerini kontrol etmek güvenlik için önemlidir. Bu kontrolu $_FILES[‘userfile’][‘type’] değerini kullanarak yapabilirsiniz. Bu değer tarayıcı tarafından gönderildiği ve PHP bu değeri ayrıntılı kontrol etmediği için olması gereken değerinden farklı gönderilebilir. Kullanıcı çalıştırılabilir bir dosya (Örneğin php dosyası) image/gif gibi yükleyip daha sonra bu dosyayı çalıştırıp sunucunuzda işlem yapabilir. Daha güvenli kontrol için mime_content_type() ,getimagesize() gibi fonksiyonları kullanılarak dosya türü hakkında daha doğru bilgi alınabilir.
4) Max_input_time belirteci bir betiğin girdi (input) alırken geçirebileceği azami süreyi belirtir. Bu süre yavaş bağlantılarda boyutu büyük dosyaları yükleme sırasında geçilebilir ve bu durum dosya yüklenmesine engel olur.
5) Farklı dosya sistemleri ve listeleme türleri olduğu için dosya isimlerinde boşluk, Türkçe karakter kullanılan dosyaların işlemlerinde hata olabilir.

Leave a Reply