Arşiv sayfasından bütün yazılarıma ulaşabilirsiniz

eburhan Upload class

uploadWeb sitesi hazırlarken upload işlemlerinde gerekli önlemleri almazsak daha sonra istenmeyen sonuçlarla karşılaşabiliriz. Örneğin kötü niyetli birisi "hack.php" gibi bir dosyayı yükleyip çalıştırırsa web sitemizi hack edebilir. Veyahut geçerli bir resim dosyası olmadığı halde "resim.gif" gibi bir dosyayı yükleyebilir. Buna benzer problemlerin önüne geçmek için PHP diliyle bir upload sınıfı hazırladım.

Sınıfın en önemli özellikleri

  1. Belirttiğiniz dosya türleri dışında dosyaların yüklenmesine izin vermez
  2. Yüklenen dosyalarda "resim" dosyaları varsa, her birinin gerçekten bir resim dosyası olup olmadığını otomatik olarak kontrol eder.
  3. Yüklenecek dosyaları istediğiniz klasöre kaydedebilirsiniz. Klasör yoksa sizin yerinize oluşturmayı dener ve "chmod" ayarını yapmaya çalışır.
  4. Aynı anda kaç adet dosyanın yükleneceğini ayarlayabilirsiniz. Örneğin; tek bir yükleme işleminde en az 5, en fazla 15 dosya yüklenebilsin gibi...
  5. Yüklenen dosyaların boyutlarını sınırlandırabilirsiniz. Örneğin; yüklenmek istenen herbir dosyanın boyutu en az 10, en fazla 100 KB olsun gibi...
  6. Yüklenen dosyaları yeniden isimlendirebilirsiniz. Ayrıca yüklenen her bir dosya için benzersiz isimler de oluşturabilirsiniz.
  7. Dosya isimlerinin başına veya sonuna bir ifade ekleyebilirsiniz.
  8. Bütün kotroller sunucunun "geçiçi" klasöründe yapılır. Herhangi bir sorun oluşmazsa, dosyaları istediğiniz klasöre taşıyabilirsiniz.

Sınıfın kullanımı

İlk önce upload işleminin yapılabilmesi için bir upload formu hazırlamamız gerekiyor. Alttaki kodlarla basit bir upload formu oluşturabiliriz.

HTML:
  1.  
  2. <form method="post" action="yukle.php" enctype="multipart/form-data">
  3.     <input name="dosyalar[]" type="file" />
  4.     <br>
  5.     <input name="dosyalar[]" type="file" />
  6.     <br>
  7.     <input name="dosyalar[]" type="file" />
  8.     <br>
  9.     <button name="submit" type="submit">Yükle</button>
  10. </form>
  11.  
  12. </body>
  13. </html>

Yukarıdaki kodların ekran görüntüsü aşağıdaki resimdeki gibi görünecektir.

Upload Formu

Bu upload formunu işlemek için eburhan Upload class'ı şöyle kullanabilirsiniz.

PHP:
  1. <?php
  2.   // sınıfı çağır
  3.   require_once('eb.upload.php');
  4.  
  5.   // yüklenecek dosyalar varsa devreye gir
  6.   if( $_FILES ) 
  7.   {
  8.       // sınıfı hazırla
  9.       $up = new UPLOAD( $_FILES['dosyalar'] );
  10.  
  11.  
  12.       // yüklenecek dosyalar hangi klasöre kayıt edilecek
  13.       $up->yolDizin('./upload');
  14.  
  15.       // 100 KB'a kadar olanlara izin ver
  16.       $up->maxBoyut(100);
  17.  
  18.       // izin verilecek dosya türleri
  19.       $up->tipKabul('gif,jpg,png');
  20.  
  21.  
  22.       // yükleme işlemini başlat
  23.       if( $up->baslat() === FALSE ) {
  24.          echo $up->sonHata();
  25.       } else {
  26.          echo 'Dosyalar başarıyla yüklendi';
  27.       }
  28.  
  29.   }
  30. ?>

Yukarıdaki kodda yüklenmek istenen dosyaların upload isimli klasöre kaydedilmesini sağlıyoruz. Daha sonra herbir dosya boyutunun en fazla 100 KB olabileceğini ve sonra yüklenmek istenen dosyaların gif, jpg, png formatlarında olabileceğini belirtiyoruz.

Sonuç...

Hazırlamış olduğum eburhan Upload class sınıfının yetenekleri burada anlattığımla sınırlı değil. Daha fazla bilgi almak isteseniz alttaki bağlantıdan bu sınıfı indirebilirsiniz. İndireceğiniz dosya içerisinde ayrıntılı bir dökümantasyon mevcut. Bu dokümantasyon, sınıf hakkında merak ettiklerinize büyük bir ihtimal cevap verecektir. Yine de sormak istedikleriniz olursa bana istediğiniz zaman ulaşabilirsiniz ;)

indir
EkleBunu Sosyal Paylaşım Butonu

28 yorum var

  1. öncelikle eline sağlık

    ancak bir eksik var sanırım ya da ben işin içinden çıkamadım:

    mesela izin verilen dosya tipleri rar,zip,jpg,gif olsun. bu durumda rar dosyaları da _imgKontrol’den geçiyor ve resim olmadığı için hata alıyor ve sonuçta hiç bir dosya yüklenmiyor…

  2. Güzel hazırlanmış bir class. Teşekkürler.

  3. @bocek
    Uyarın için teşekkürler.
    imgKontrol() fonksiyonuna gerekli kodları yazmayı unutmuşum (: Şimdi düzelttim.
    Yeniden indirip test edersen sevinirim ;)

  4. Daha denemedim ama amacınızı buradan tebrik etmek istiyorum.

  5. […] - eburhan.com - eburhan Upload class […]

  6. Ben sadece blog işiyle uğraştığım için işime yaramıyor ama güvenliği nasıl artırırım diyenler için faydalı bir yazı..

  7. Türkçe bloglar arasında en faydalılardan birisi. Rüya tabiri, fıkra olmadan da şahane bir blog olabiliyormuş. Eline sağlık…

  8. Güzel olmuş ellerine sağlık fakat tür jpg veya gif ise resize ettirilebilirdi. ellerine sağlık tekrardan. benim ki fikir tabi oturup birtane de ben yazayım.

  9. @Coder
    Resim boyutlandırmayı bilerek eklemedim çünkü bu sınıfın görevi “yalnızca sunucuya dosya yüklemek” olsun istedim.

    Ayrıca ben resim işlemleri için yine kendi yazdığım ayrı bir sınıf kullanıyorum. İleride yayınlarım belki. Ama siz bu upload sınıfını “miras alarak” resim boyutlandırma yeteneği kazandırabilirsiniz.

  10. Teşekkurler Güzel çalışma

  11. Açıkçası kendim yazacaktım php classısta arayim derken :D Türk mucit yapıvermiş.

  12. Merhaba, class’inizi kendi yazdigim bir icerik yönetim sisteminde kullaniyorum.

    tipKabul() fonksiyonunda dosya uzantilari yerine mime-type’lara göre kontrol ettirseniz olmaz mi? Bazi resimlerin uzantilari resmin gercek tipinden farkli olabiliyor.

  13. @Leon
    Öncelikle class’ı kullandığın için teşekkürler. Soruna gelince…
    Mime-type ile kontrol ettirmek bana göre güvenli değildir. Çünkü bir dosyanın mime-type’ını kolayca değiştirebiliyorsun. Böylece olunca gerçekte PHP olan bir dosyayı PNG resmiymiş gibi yükletebilirsin.

    Ayrıca bu class yüklenmek istenen dosyalardan hangilerinin gerçekten resim olup olmadığını kendisi otomatik olarak kontrol ediyor. Senin ekstra birşey yapmana gerek yok yani ;)

  14. peki bu upload’dan sonra linki falan nasıl göstercez onları da yazsaydın keşke.

  15. @YuqseLx
    Ne linki acaba? Biraz daha açıklayıcı yazarsan sevinirim.

  16. yani upload ettikten sonra resmin gösterim şekilleri imageshack.us’taki gibi

  17. Hocam güzel bir class olmuş demin kullandım bir işimde. yanlız, bu upload edilen dosyanın adını nasıl alabiliriz, böyle bir imkanımız olabilir mi ?

  18. 2 ufak hata bildirmek istiyorum:

    1. _dosyaIsmiTemizle() fonksiyonunda “ü” ve “Ü” harfleri “u” harfi yerine “y” harfine dönüştürülüyor. klavyede “u” ve “y” yanyana olduğu için bir hata yapılmış sanırım. :)
    2. yine _dosyaIsmiTemizle() fonksiyonunda “$onlyName” değişkeni ile ilgili bir sorun var. Eğer yüklemek istediğim dosyanın uzantısı, dosya isminde de geçiyorsa sorun oluşuyor. Örneğin: “bu.bir.jpg.dosyası.jpg” isminde bir resim yüklemek istersem “bu_bir.jpg” şekline dönüşüyor. Çünkü “$onlyName” explode() ile bulunuyor ve bu da bu çeşit bir hataya sebep oluyor.

  19. Çok güzel bir class olduğunu belirtmek isterim

    $up->yeniAd();
    bu fonksiyonu dizi halinde çalıştırmak isterseniz
    class yapısında fonksiyonda else parametresindeki $ad kısmına [$i] demek yeterli oluyo bunu farkettim paylaşmak istedim ellerine sağlık.

  20. Yorumlarınızın hepsini not ettim. Birkaç gün içerisinde yeni bir güncelleme yayınlayacağım. Class’ı kullandığınız için teşekkürler ;)

  21. […] eburhan Upload Class isimli PHP uygulaması ile bir sunucuya dosya yükleme işlemi yapabiliyorduk. Css Message Boxes isimli CSS uygulaması ile de web sayfamızı kullananlara, yapılan bir işlemin sonrasında renkli mesaj kutuları gösterebiliyorduk. Bu 2 uygulamada bazı güncellemeler oldu. Eğer bu uygulamalardan herhangi birisini kullanıyorsanız bu yazıdaki güncellemelere gözatmanızı öneriyorum. […]

  22. Selamlar,

    Kontroller için Erişim kontrol listesi tarzında yapsan daha hoş olurdu..

  23. @Onur Yerlikaya
    Nasıl mesela? Bir örnek gösterebilir misin?

  24. Öncelikle çok güzel ve düzenli kodlanmış bu sınıfı yazdığınız için çok çok teşekkürler. Ufak bir önerim olacak:

    Dosya tür kontrollerinde uzantılardan ziyade MIME tür kontrolü baz alınsa daha iyi olur gibime geliyor, biliyorum resim dosyaları için bu yapılmış durumda zaten ama bilinen sıkça kullanılan dosya türleri için de bu tip kontrol desteklense daha iyi olur kanımca…

    Saygılarımla…

  25. Çok güzel bir çalışma gerçekten ellerinize ve gözlerinize sağlık.

    Fakat benim sormak istediğim birşey var. Bu sınıfınızı jquery’nin ajax fonksiyonu ile kullanmak istediğimde formu serialize yaptığım zaman ne yazık ki dosya bilgileri hariç bütün bilgileri alabiliyorum formdan. Çözüm için bir öneriniz var mı acaba? Ne yazık ki basit bir çözüm bulamadım.

  26. @tmrtzcn
    Ajax ile dosya gönderirken farklı bir yol izlemen gerekiyor. Aşağıdaki linkten bu konuda bilgi alabilirsin.

    http://ajax-tr.com/ajax-ile-dosya-gondermek/

  27. peki bir sunucudan kendi sunucumuza dosya çekmek istersek nasıl olacak ? nasıl yapabiliriz ?

  28. @ahmet
    sunucudaki bir dosyayı kaydetmek için php’nin yerleşik “file_get_contents” fonksiyonunu kullanabilirsin. Veya cURL eklentisi etkinse onu da kullanabilirsin. Şurada örnek bir kod var.

İçinizde kalmasın, siz de yorum yazın.