$_FILES

Örnek kod ve açıklamalar

$_FILES$_FILES , $_ENV , $_SESSION , $_REQUEST

Dosya yükleme

Genel olarak php ile dosyaların gönderilmesi ve yüklenmesi iki kısımda inceleyebiliriz. Bunlardan birincisi, dosyalarımızın sunucumuza geçici olarak yüklenmesidir.Öncelikle yapmamız gereken bir tane dosya yükleme formu oluşturmamız olacaktır.

 

<form action="dosya_yukle.php" method="post" enctype="multipart/form-data">
        <label for="file">Dosya Adı:</label>
        <input type="file" name="file" id="file" />
        <input type="submit" name="submit" value="Yükle" />
</form>

şeklinde dosya yükleme formunu oluşturup form.php adı altında kaydetmemiz yeterli olacaktır. Daha sonra da form tarafından gönderilen verilerin işleneceği dosya_yukle.php adındaki dosyamızı oluşturmayalıyız. Onu da,

<?
if ($_FILES["file"]["error"] > 0)
  {
  echo "Error: " . $_FILES["file"]["error"] . "<br />";
  }
else
  {
  echo "Yüklenen dosya: " . $_FILES["file"]["name"] . "<br />";
  echo "Dosyanın türü: " . $_FILES["file"]["type"] . "<br />";
  echo "Dosyanın büyüklüğü: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
  echo "Geçici depo adresi: " . $_FILES["file"]["tmp_name"];
  }
?>

şeklinde oluştururuz. Buradaki bazı kullanımlar çok önemlidir.

  • $_FILES["file"]["error"]
    Dosya yüklenmesinde eğer bir sorun ile karşılaşıldıysa karşılaşılan sorunu
  • $_FILES["file"]["name"]
    Yüklediğimiz dosyanın adını
  • $_FILES["file"]["type"]
    Yüklenilen dosyanın türünü
  • $_FILES["file"]["size"]
    Yüklediğimiz dosyanın büyüklüğünü
  • $_FILES["file"]["tmp_name"]
    Yüklediğimiz dosyanın sunucu tarafından oluşturulan geçici kopyasının adını bizlere vermektedir.

$_FILES['file']['error'] Hata kodudur. Form doldurulup gönderildiğinde dosya geçici dizine geçici bir isimle yüklenir ve PHP $_FİLES dizisini kullanarak dosyayı istediğimiz dizine kopyalayabiliriz. Örnek:
 

<?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 :';
       
        print_r($_FILES);
?>

 

Yukarıdaki kullanımda dosyamızı sunucumuza yükleyip, sunucuda geçici olarak bir kopyasını oluşturduk. İkinci kısımda ise, geçici olarak oluşturulan bu dosyanın sunucularımızda kalıcı olarak depolanmasını sağlayacağız. Bu kısımda, kaydetmiş olduğumuz dosya_yukle.php dosyasına ek satırlar eklememiz gerekecek ve dosyamızın en son hali,

<?php
if ($_FILES["file"]["error"] > 0)
        {
        echo "Error: " . $_FILES["file"]["error"] . "<br />";
        }
else
        {
        echo "Yüklenen dosya: " . $_FILES["file"]["name"] . "<br />";
        echo "Dosyanın türü: " . $_FILES["file"]["type"] . "<br />";
        echo "Dosyanın büyüklüğü: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />";
        echo "Geçici depo adresi: " . $_FILES["file"]["tmp_name"] . "<br />";
        
        if (file_exists("Depo/" . $_FILES["file"]["name"]))
             {
             echo $_FILES["file"]["name"] . " kalıcı olarak depolanamadı. Aynı adı taşıyan başka bir dosya bulunmakta. ";
             }
      else
            {
            move_uploaded_file($_FILES["file"]["tmp_name"], "Depo/" . $_FILES["file"]["name"]);
            echo "Kalıcı depo adresi: " . "Depo/" . $_FILES["file"]["name"];
           }
        }
?>

şeklinde olmalıdır. Eklediğimiz satırların yaptığı işlere gelince,

if (file_exists("Depo/" . $_FILES["file"]["name"]))- Yüklediğimiz dosyanın Depo adlı klasörün içinde olup olmadığını kontrol ediyor. Eğer aynı adı yaşıyan başka bir dosya bulunuyorsa, hata veriyor ve dosyayı taşımıyor. Eğer aynı adı taşıyan başka bir dosya bulunmuyorsa, move_uploaded_file($_FILES["file"]["tmp_name"], "Depo/" . $_FILES["file"]["name"]) komutu ile geçici olarak oluşturulan dosyayı Depo klasörünün içerisine kopyalıyor. Ancak geçici olarak yüklenen dosyaları taşıyacağımız klasörün oluşturulmuş olması gerekmektedir. Php ile dosya yüklerken yapabileceklerimiz bunlarla da sınırlı değil. Yükleyeceğimiz dosyaların türlerini ya da boyutlarını da kontrol etmemiz mümkündür. Yapmamız gereken sadece küçük bir if cümleciği yazıp kontrol sağlamaktır.

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);
            }
}
?> 

Dosyaları güvenlik için kontrol etmemiz gerekir, 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. Daha güvenli kontrol için mime_content_type() ,getimagesize() gibi komutla dosya hakkında daha fazla bilgi edinilebilir.

İ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.

PHP ile birçok şeyi yaptığımız gibi, elimizde bulunan dosyaları değiştirmemiz, silmemiz, ya da yeni dosyalar yaratmamız mümkün. Php de dosyalar ile ilgili işlemler yapacağımız zaman bilmemiz gereken belli başlı fonksiyonlar bulunmaktadır. Bunlardan birincisi,

fopen() : fopen fonksiyonu Php ile elimizdeki dosyaları açmamızı sağlar.

<?
        $dosya=fopen("deneme.txt", "r");
?>

şeklinde bir sözdizimi bulunmaktadır. Fonksiyonun aldığı ilk parametre açılacak olan dosyanın adresini, ikinci parametre ise açılacak olan dosya üzerinde yapılacak olan işlemlere olan izinleri belirtmektedir.

  • r : Dosyaya okuma izni verilmesini sağlar. Dosyanın ilk satırından itibaren değerlendirmeye alır.
  • r+ : Okuma ve yazma izinlerinin verilmesini sağlar. Dosyanın ilk satırından itibaren değerlendirmeye alır.
  • w : Dosyaya yazma izninin verilmesini sağlar. Eğer dosyanın içi boş değilse içindeki herşeyi siler. Eğer o adı yaşıyan dosya mevcut değilse, kendisi oluşturur.
  • w+ : Okuma ve yazma izinlerinin verilmesini sağlar. Eğer dosya boş değilse içindeki herşeyi siler. Eğer o adı taşıyan dosya mevcut değilse, kendisi oluşturur.
  • a : Ekleme izninin verilmesini sağlar. Dosyayı açarak sonuna ekleme yapılmasını için gerekli izinleri verir. Eğer o adı taşıyan dosya mevcut değilse kendisi oluşturur.
  • a+ : Ekleme ve okuma izinlerinin ikisinin de aynı anda verilmesini sağlar. Dosyanın içeriğini değiştirmeden dosyanın sonuna ek yapmamızı sağlar. Eğer o adı taşıyan bir dosya mevcut değilse kendisi oluşturur.
  • x : Sadece yazma izininin verilmesini sağlar ve yeni bir dosya oluşturmaya yarar. Eğer o adı taşıyan dosya bulunuyorsa FALSE döner.
  • x+ : Yazma ve okuma izinlerinin aynı anda verilmesini sağlar ve aynı şekilde yeni bir dosya oluşturur. Eğer o adı taşıyan dosya bulunuyorsa, FALSE döner.

fclose() :fopen() fonksiyonu ile açtığımız dosyayı kapatmaya yarar.

<?
        $dosya=fopen("deneme.txt", "r");
       
        //çalıştırılacak kodlar.
       
        $fclose($dosya);
?>

şeklinde bir kullanımı vardır. Tek yapmamız gereken dosyayı açarken vermiş olduğumuz değişkenin aynısını kapatırken de göstermeye dikkat etmek.

feof() : Açtığımız dosyadaki tüm bilgileri okuyup satırın sonuna gelip gelmediğimizi kontrol eden fonksiyondur. w, a ve x izinlerini verdiğimiz bir dosyada okuma işlemini gerçekleştiremediğimiz için foef() fonksiyonu da kullanamaz duruma geliyor. Uzunluğunu bilmediğimiz dosyaları okumakta kullanılan çok faydalı bir fonksiyondur.

fgets() ve fgetc() : Bu iki fonksiyon da açmış olduğumuz dosyaların içeriklerini okumaya yarar. fgets() fonksiyonu dosyayı satır satır okurken, fgetc() fonksiyonu dosyayı karakter karakter okur. Kullanımlarına gelince;

<?
                $dosya=fopen("deneme.txt","r");
                       
                        while(!feof($dosya))
                        {
                        echo fgetc($dosya);
                        }
               
                fclose($dosya);
?>

ve

<?
                $dosya=fopen("deneme.txt","r");
                       
                        while(!feof($dosya))
                        {
                        echo fgets($dosya);
                        }
               
                fclose($dosya);
?>

şeklindeki bir kullanımda "deneme.txt" dosyasına okuma izni verip, sonra da dosyanın sonuna gelinceye kadar while yapısını kullanarak okuduk, ve ekrana yazdırdık. Tek farklı yönleri yukarıda da dediğimiz gibi fgets() fonksiyonu satır satır okuyor, fgetc() fonksiyonu ise karakter karakter okuyor.

file(): Bir dosyanın içeriğini dizinin içerisine aktaracağımız zaman kullandığımız fonksiyondur. Dosyanın içerisindeki verileri satır satır okuyarak her bir satırı dizinin bir elemanı olarak kaydetmemizi sağlar. Dosyanın içerisinde boş satır varsa onları da olduğu gibi boş satır olarak diziye aktarır.

Kaynak Uğur Kahraman, Ömer Mercaner
Yorumunuzu Ekleyin
$_FILES Yorumları +4 Yorum
  • yagiz
    1
    yagiz
    güzel bir ders , teşekkür ederim
    29 Haziran 2010 00:32:32, Salı
  • Ali İmran
    1
    Ali İmran
    _FILES boş olup olmadığı nereden anlaşılır nasıl kontrol edebilirim boş olup olmadığını
    25 Mart 2013 18:07:43, Pazartesi
  • Hasan Uğur Dalıç
    1
    Hasan Uğur Dalıç
    @Ali imran, is_uploaded_file fonksiyonu ile kontrol edebilirsin..
    07 Nisan 2013 13:35:32, Pazar
  • Deniz
    1
    Deniz
    Yüklenen resmi yeniden adlandırmak için ne yapmamız gerekli?
    18 Şubat 2015 00:28:19, Çarşamba


Yükleniyor...
Yükleniyor...