Dosya yükleme işlemi günümüzde neredeyse her web sitesinde mevcuttur. Php dosya yükleme fonksiyonu ile dosyaların sunucuya yüklenmesini sağlayacağız. Dosya yükleme işlemini gerçekleştirmek için formları kullanıyoruz. Php ile Form Kullanımı başlık yazımda formlar aracılığı ile dosya yükleme yaparken kullandığımız file form elemanından bahsetmiştim.
Php ile dosya yükleme işlemi için ilk olarak yükleme formumuzu oluşturuyoruz. Dosya yükleme formumuzu oluştururken enctype parametresinin multipart/form-data olması gerektiğini unutmayın.
<h4>Php Dosya Yükleme</h4> <form action="" method="post" enctype="multipart/form-data"> <input type="file" name="dosya"> <br /> <button type="submit" style="margin-top:15px;">Yükle</button> </form>
Formlardan veri almak için $_GET ve $_POST süper global değişkenlerinin kullanıyoruz. Formlar aracılığı ile gönderilen dosya bilgilerine erişmek için ise $_FILES süper global değişkeni kullanılmaktadır. Süper global değişkenler hakkında bilgi almak için Php Süper Global Değişkenler başlıklı yazıma göz atabilirsiniz.
$_FILES Süper Global Değişkeni
Yukarıda oluşturduğumuz form ile gönderdiğimiz dosyanın bilgilerine $_FILES süper global değişkeni ile erişiyoruz.
<?php echo "<pre>"; print_r($_FILES); echo "</pre>"; ?>
Gönderdiğimiz dosyanın tüm bilgileri $_FILES süper global değişkeni içerisinde dizi olarak saklanır. Bu dizinin içerisindeki değerleri görmek için print_r fonksiyonu ile $_FILES değişkenimizi yazdırdık ve aşağıdaki sonuçları elde ettik.
[dosya] => Array ( [name] => ornek.png [type] => image/png [tmp_name] => C:\wamp64\tmp\php1CBE.tmp [error] => 0 [size] => 80014 )
$_FILES değişkeni içerisinde beş adet değerin anahtar kelimeler ile dizi halinde saklandığını görebilirsiniz.
Değişken | Açıklama |
name | Yüklenen dosyanın ismidir. |
type | Yüklenen dosyanın MIME(veri) türünü verir. |
tmp_name | Yüklenen dosyanın geçici olarak saklandığı dizindir. |
error | Yükleme işlemi ile ilgili hata kodlarını belirtir. Eğer 0 (sıfır) ise yükleme başarılıdır. |
size | Yüklenen dosyanın byte cinsinden boyutunu verir. |
Dosyayı Sunucuya Yükleme
Dosya yükleme işlemi esnasında form elemanının verisine ulaşmak için name değerini kullanıyoruz. Bu nedenle form elemanlarına vereceğiniz isimlerin amacına uygun olmasına özen göstermelisiniz. Örnek formumuzda form elemanımıza name parametresine dosya ismini verdim.
<?php if ($_FILES["dosya"]["name"]) { $yuklenecek_dosya = $_FILES["dosya"]["tmp_name"]; $dosya_ismi = $_FILES["dosya"]["name"]; if (move_uploaded_file($yuklenecek_dosya, $dosya_ismi)) { echo 'Dosya karşıya yüklendi!'; } else { echo 'Dosya yüklenemedi!'; } } ?>
Yüklenen dosya aksi bir yol belirtmediğimiz için php dosyası ile aynı dizine yüklenecektir. Örnek yükleme kodumuzda her türden ve her boyuttaki dosyayı yükleyebiliriz. Fakat genellikle yüklenecek dosyanın boyutunu php tarafından kısıtlanmıştır bu nedenle istediğimiz boyutta yükleme yapamayabiliriz. Örnek kodumuzda dosya boyutunu ve türünü kısıtlama yoktur.
Formatına Göre Dosya Yükleme
Uygulamalarımızda kullanıcıların istedikleri şekilde dosya yüklemelerini önlememiz gerekmektedir. Sadece amacına uygun dosya yüklenmesini sağlamamız gerekir. Çünkü profil fotoğrafı alanı için kullanılacak dosyanın görsel formatına sahip bir dosya olması gerekir. Fakat dikkatsiz ve art niyetli kullanıcılar bu alan için görsel formatına sahip olmayan dosyalar seçip yükleyebilirler. Yüklenen bu dosyayı kullanamayacağımız gibi bazı güvenlik sorunları da beraberinde gelebilir.
Yukarıdaki kontrolsüz yükleme kodumuzu aşağıdaki dosya formatının kontrol edildiği kod ile güncelliyoruz. Bu kodumuza ek olarak dosya uzantılarını saklayan bir dizi tanımlıyoruz ve dosya uzantısının dizi içerisinde olup olmadığını dizi fonksiyonu(in_array) ile kontrol ediyoruz.
Dizi fonksiyonları hakkında detaylı bilgi için Php Dizi Fonksiyonları başlıklı yazıma göz atabilirsiniz.
<?php if ($_FILES["dosya"]["name"]) { $yuklenecek_dosya = $_FILES["dosya"]["tmp_name"]; $dosya_ismi = $_FILES["dosya"]["name"]; $dosya_uzantilari = array("image/png", "image/jpeg", "image/jpg"); if (in_array($_FILES["dosya"]["type"], $dosya_uzantilari)) { if (move_uploaded_file($yuklenecek_dosya, $dosya_ismi)) { echo 'Dosya karşıya yüklendi!'; } else { echo 'Dosya yüklenemedi!'; } } else { echo ' Dosya uzantısı sadece PNG, JPEG, JPG olabilir.'; } } ?>
Boyutuna Göre Dosya Yükleme
Kullanıcımızı sadece istediğimiz formattaki dosyayı yüklemeye zorladık ama dosya boyutuna kısıtlama getirmedik. Bu nedenle kullanıcı bir profil fotoğrafı için yüksek çözünürlüklü yükleme yapabilir. Aynı işi daha düşük çözünürlüklü ve dolayısıyla daha düşük boyutlu fotoğraf ile yapmak mümkün. Örnek olarak verdiğim profil fotoğrafı yerine 10mb olan fotoğrafta 1mb olan fotoğrafta aynı işi yapacaktır. Sunucumuzda gereksiz depolama işgalini önlemek için kullanıcıların yükleyecekleri dosyalara boyut sınır getirmemiz gerekir.
Hatırlatma : Her ne kadar kodumuzda bir boyut sınırlaması olmasa bile genellikle tüm php sunucularında sunucu taraflı bir sınırlama mevcuttur. Bu sınırlama her firmada farklı olabilir. Kodumuzu yazarken kullanılacak alana en uygun sınırlamayı yapmayı unutmayın.
<?php if ($_FILES["dosya"]["name"]) { $yuklenecek_dosya = $_FILES["dosya"]["tmp_name"]; $dosya_ismi = $_FILES["dosya"]["name"]; $dosya_uzantilari = array("image/png", "image/jpeg", "image/jpg"); $maksimum_boyut = 1024 * 1000; /* 1024B * 1024 = 1024 KB */ if ($_FILES["dosya"]["size"] < $maksimum_boyut) { if (in_array($_FILES["dosya"]["type"], $dosya_uzantilari)) { if (move_uploaded_file($yuklenecek_dosya, $dosya_ismi)) { echo 'Dosya karşıya yüklendi!'; } else { echo 'Dosya yüklenemedi!'; } } else { echo 'Dosya uzantısı sadece PNG, JPEG, JPG olabilir.'; } } else { echo ' Dosya boyutu en fazla 1MB olabilir.'; } } ?>
Yukarıda kodumuza ek olarak maksimum boyutu hesapladığımız bir değişken tanımladık ve if karar yapısı ile gönderilen dosyanın boyutunu maksimum boyut değişkeninin değeri ile kıyasladık.
$_FILES[‘size’] bize dosyanın byte cinsinden boyunu vermektedir. Yüklenecek dosyanın boyutunu hesaplarken byte cinsinden hesaplarız. Burada 1024B (Byte) = 1KB (Kilobyte) olduğundan 1024B * 1024 = 1024 KB yani 1 MB olacaktır. Bu nedenle maksimum yükleme boyutu 1MB olarak belirlenmiştir.