25 Mayıs 2014 Pazar

Dosya Upload Etme


 Bu konuyu anlamak için öncelikle daha önce yazmış olduğumuz php'de form konulu makaleyi okumalısınız.Okumadıysanız buradan okuyabilirsiniz.Dosya upload ettirirken belirli koşullarla bazı kısıtlamalar getirmemiz gerekiyor.Yoksa isteyen istediği kodu upload ederek sitemizi yönlendirebilir.Sistemimizde ciddi bir açık oluşabilir. 


Upload Formu


 Bunu form elemanlarından file form türünü seçerek yapacağız.form etiketine enctype değerine dosya upload edeceğimiz için “multipart/form-data” parametresini ekleyeceğiz. 



 Kod Çizelgesi     Kod Dili: htmlHepsini Seç

<form action="gonder.php" method="post" enctype="multipart/form-data">
   <
input type="file" name="dosya" />
   <
input type="submit" value="Gönder" />
</
form



 Bu formu kendi localhostunuzda deneyerek nasıl bir görüntüyle karşılaşacağınızı görebilirsiniz.Gönder butonuna basıldığında belirtilen dosya gönder.php adresine gönderilecektir. 

Gönderilen Dosyaları Kontrol Etmek


Şimdi asıl olay başlıyor.Herkez dosya upload işlemini yukarıda verdiğim formu kullanarak yapabilir.Fakat o form da belirtilengönder.php adresine güvenlik bakımından çeşitli kısıtlamalar getirmezseniz başınız çok ağrıyabilir.İlk olarak gönder.php adresine bir dosya gönderilmişmi diye kontrol edeceğiz.Daha sonra bütün form elemanlarında olduğu gibi file formu türüde $_FILES global değişkeninden taşınmaktadır.Bizde gönder.php adresinde $_FILES değişkenini sorgulayarak gelen dosyanın özelliklerine bakıp ne olduğunu anlayacağız. 



 Kod Çizelgesi     Kod Dili: phpHepsini Seç

<?php if(isset($_FILES['dosya'])) {
   echo 
'Dosya gönderilmiş';
} else {
   echo 
'Lütfen bir dosya gönderin';
?> 



 Bu örnekte yanlızca sayfaya bir upload yapılmış mı diye kontrol ettik. Şimdi eğer dosya gönderilmişse boyutuna ve tipine bakma sırasında. 

 Bunlar için $_FILES global dizininin bizim dosyamız için ürettiği diğer alt dizin değerlerine bakacağız, bunları bir tabloda gösterelim. 

İsim       Açıklama 
name   Gönderilen dosyanın adı 
type   Gönderilen dosyanın tipi 
tmp_   name Gönderilen dosyanın geçici olarak sunucuda barındığı adres. 
size   Gönderilen dosyanın bayt cinsinden boyutu 
error   Dosya gönderilirken gerçekleşen hata kodu 

 Yukarıdaki değerleri $_FILES global dizininde kendi dosya elementi adımızı girdikten sonra alt dizin şeklinde erişeceğiz. 



 Kod Çizelgesi     Kod Dili: phpHepsini Seç

<?php if(isset($_FILES['dosya'])){
   
$hata $_FILES['dosya']['error'];
   if(
$hata != 0) {
      echo 
'Yüklenirken bir hata gerçekleşmiş.';
   } else {
      
$boyut $_FILES['dosya']['size'];
      if(
$boyut > (1024*1024*3)){
         echo 
'Dosya 3MB den büyük olamaz.';
      } else {
         
$tip $_FILES['dosya']['type'];
         
$isim $_FILES['dosya']['name'];
         
$uzanti explode('.'$isim);
         
$uzanti $uzanti[count($uzanti)-1];
         if(
$tip != 'image/jpeg' || $uzanti != 'jpg') {
            echo 
'Yanlızca JPG dosyaları gönderebilirsiniz.';
         } else {
            
$dosya $_FILES['dosya']['tmp_name'];
            
copy($dosya'dosyalar/' $_FILES['dosya']['name']);
            echo 
'Dosyanız upload edildi!';
         }
      }
   }
?> 



 Evet farkındayım çok uzun ve karışık görünen bir kod oldu ama koşulları yukarıdan aşağıya doğru incelerseniz aslında gayet düzenli bir şekilde kontrol ettik ve en sonunda tüm koşulları geçtiyse copy() fonksiyonu ile dosyayı geçici dizinden alıp dosyalar dizinine gönderdik. 

 Sırayla anlatayım. İlk olarak 1. satırda isset() fonksiyonu ile sayfaya gönderilme işlemi yapılıp yapılmadığına baktık. 

 2. ve 3. satırlarda gönderilen dosya bilgilerinden error değerine bakarak dosya gönderilmesinde herhangi bir hata meydana gelmiş mi diye kontrol ettik. Eğer error değeri 0 ise bir hata meydana gelmemiş demek olur. Bu hataların sebebi daha önceden de bahsettiğimiz gibi yazma izni gibi şeylerden ötürü kaynaklanabilir. 



 Kod Çizelgesi     Kod Dili: phpHepsini Seç

<?php
$hata 
$_FILES['dosya']['error'];
if(
$hata != 0) {
  echo 
'Yüklenirken bir hata gerçekleşmiş.';
} else { 
// ... ?> 



  6. ve 7. satırlarda size değeri ile dosyanın boyutunu alıp (1024*1024*3) den büyük olup olmadığına baktık. Bu hesabın sonucu 3MB‘nin bayt cinsinden değerini verir. Eğer 3MB den büyük ise kabul etme demiş olduk. 



 Kod Çizelgesi     Kod Dili: phpHepsini Seç

<?php
$boyut 
$_FILES['dosya']['size'];
if(
$boyut > (1024*1024*3)){
   echo 
'Dosya 3MB den büyük olamaz.';
} else { 
// ... ?> 



  10 – 15 satırları arasında dosyanın tipinin ne olduğuna ve dosyanın uzantısına baktık. Burada ben örnek olarak “image/jpeg” tipini ve jpg uzantısını kullandım, sen hangi dosyalara izin veriyorsan ona göre yanlızca uzantıları ya da tipleri kullanabilirsin. Örneğin $uzanti == ‘jpg’ || $uzanti == ‘gif’ || $uzanti == ‘png’ diyerek yanlızca bu üç uzantılı dosyaların alınmasını sağlayabilirsin. 



 Kod Çizelgesi     Kod Dili: phpHepsini Seç

<?php
$tip 
$_FILES['dosya']['type']; $isim $_FILES['dosya']['name']; $uzanti explode('.'$uzanti); $uzanti $uzanti[count($uzanti)-1];
if(
$tip != 'image/jpeg' || $uzanti != 'jpg') {
   echo 
'Yanlızca JPG dosyaları gönderebilirsiniz.';
} else { 
// ... ?> 



 Son olarak da dosya tüm koşulları geçtiğinde onu copy() fonksiyonu ile geçici dizinden 2. parametresine yazdığımız dosyalar klasörüne göndermiş olduk. 



 Kod Çizelgesi     Kod Dili: phpHepsini Seç
<?php
$dosya 
$_FILES['dosya']['tmp_name']; copy($dosya'dosyalar/' $_FILES['dosya']['name']);
echo 
'Dosyanız upload edildi!'?> 




Bu derslikte bu kadar.Başka bir derste görüşmek üzere...