Konular

EBooklar

Ö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


Yorumlar

  1. yagiz
    güzel bir ders , teşekkür ederim
    29 Haziran 2010 00:32:32, Salı Like
  2. 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 Like
  3. Hasan Uğur Dalıç
    @Ali imran, is_uploaded_file fonksiyonu ile kontrol edebilirsin..
    07 Nisan 2013 13:35:32, Pazar Like
  4. Deniz
    Yüklenen resmi yeniden adlandırmak için ne yapmamız gerekli?
    18 Şubat 2015 00:28:19, Çarşamba Like



  • Kurallı İfadeler (regex Engine)
  • Kurallı İfadeler (regex Engine) ~ 31,327

    Bir regex'in gerçekte nasıl çalıştığını bilmek daha efektif çalışan regex ifadeleri oluşturmamızı ve regex'leri daha isabetli oluşturmamızı sağlar. Bu yazımızda oluşturduğunuz regex ifadelerinin neden beklediğiniz sonuçları vermediğini ve umduğunuz eşleşm...



  • PHP ile PDF dosya oluşturmak
  • PHP ile PDF dosya oluşturmak ~ 24,898

    Php ile yeni bir pdf dosyası oluşturmak : Öncelikle php ile pdf işlemleri yapmak için bir pdf kütüphanesine ihtiyacınız olacak



  • PHP nedir?
  • PHP nedir? ~ 23,358

    HTML kodlarının arasına yerleştirilmiş php kodlarından ayrıştırıp işleyerek sonuçta saf HTML formatında bir çıktı üretmek ve Web sunucusuna iletmektir.



  • Oop - Nesne Yönelimli Programlama
  • Oop - Nesne Yönelimli Programlama ~ 19,305

    Artık ister istemez her programcının bulaştığı bu teknik hakkında sayısız makale yazılmıştır bu güne kadar. Bu makale de onlardan biri


  • Xampp Kurulumu ~ 18,422

    Xampp apache, mysql, php ve phpmyadmin için kolay ve basit kurulum sağlayan bir uygulamadır.




  • Php İle Excel Dosyası Oluşturmak
  • Php İle Excel Dosyası Oluşturmak ~ 17,646

    Genelde, herhangi bir biçimlendirme söz konusu olmadığında, veritabanındaki bir bilgiyi ya da başka bir tabloyu excel ortamına aktarmak için csv yöntemini kullanırım. Bu yöntem herkesin bildiği gibi, her sütunu tab ya da noktalı virgül gibi bir karakterle...


  • Verileri doğrulamak için PHP ile filtreleme işlemleri
  • Verileri doğrulamak için PHP ile filtreleme işlemleri ~ 17,381

    Ziyaretçilerden gelen verilerin istediğimiz formata uygunluğunu kontrol etmeliyiz ki, güvenlik açığı yaratmayalım. E-postaları, web adreslerini, bilgi girişlerini ve dahasını Her birine uygun farklı fonksiyonlar yazıldı bu vakte kadar. Ancak PHP 5.2.0 ve ...


  • En iyi 25 php template motoru
  • En iyi 25 php template motoru ~ 16,801

    Php tabanlı web siteleri dizayn ederken, php kodlarını html kodlar arasına gömeriz. Fakat gün gelir bu kodları düzenlemek istediğimizde çok büyük bir çaba gerektirir. Bu tarz durumlarla başa çıkabilmek için ve daha kararlı bir sistem kodlamak için t...


  • Php Mysql to XML
  • Php Mysql to XML ~ 16,538

    Bu yapıyı geliştirerek mysql veritabanınızdaki datalarınızı xml standartlarına dönüştürebilirsiniz.


  • Php ile Oturum Yönetimi (SESSION)
  • Php ile Oturum Yönetimi (SESSION) ~ 16,536

    Türkçesi oturum anlamına gelen session bilgilerin saklanması için kullanılan mantıksal bir nesnedir.Session oturum yönetimini kullanarak şifreli sayfalar oluşturarak ve bu sayfaları belirlediğiniz kullanıcıların görmesini sağlayabilirsiniz.



  • Dizi Tanımlamaları
  • Dizi Tanımlamaları ~ 16,453

    PHP’de array tanımlayıcısını kullanarak içerisinde elemanları yerleştirmek yoluyla ya da index numarasını köşeli parantezler içerisinde belirterek atama yaparak dizi oluşturmak mümkündür



  • $_SERVER
  • $_SERVER ~ 16,161

    $_SERVER host bilgileri, header bilgileri, yollar ve script yolları gibi bilgileri içeren bir dizidir. Bu dizideki değerler web server tarafından üretilir. Tüm server yazılımlarının, tüm değerleri atayacağına dair bir kesinlik yoktur. Yazılım bazıl...