Hoşgeldiniz Webmaster Forum | Türkiyenin En iyi Webmaster Platformu

Webmaster Forum - Tüm özelliklerimize erişmek için şimdi webmaster topluluğumuza katılın.
  • Kayıt olduktan ve giriş yaptıktan sonra, konu oluşturabilir, mevcut konulara cevap gönderebilir,
  • diğer üyelerinize itibar kazandırabilir, kendi özel mesajlaşma programınızı edinebilir ve çok daha fazlasını WF ile yapabilirsiniz.
  • Ayrıca hızlı ve tamamen ücretsiz, ne bekliyorsun?
  • PHP ile dosya Upload

    WebmasterForum

    Moderator
    Katılım
    19 Ara 2017
    Forum
    539
    Reaksiyon
    60
    Puan
    27
    Konum
    16 | Bursa
    Web
    wf.com.tr
    Meslek
    webmaster
    PHP ile dosya Upload

    PHP dosya yükleme işleme için önceki derslerde öğrendiğimiz html formunu kullanacağız. Başkalarının bilgisayarında olan dosyaları kendi sunucumuza göndereceğimiz bu çalışmada güvenlik için biraz dikkatli ve tedbirli olmamız gerekiyor.

    Eğer hiç bir koşul uygulamadan saf bir upload uygulaması yapacak olursak, isteyen herkes sitemize istediği dosyayı ve yazılımı gönderebilir, kendi kodlarını atıp sitemizi ele geçirebilir.

    Bunun için dosyaları enine boyuna kontrol edip onayladıktan sonra sitemize göndereceğiz. Öncelikle dosya uzantısına, dosya boyutuna ve dosyanın tipine bakacağız. Tipini ya da boyunu beğenmezsek almayacağız.
    PHP upload formu hazırlama

    Bunun için başta da dediğim gibi önceden anlattığımız html formunu kullanacağız. Ve bu formda gönderilecek dosyayı seçmemizi sağlayacak olan file form elementini yerleştireceğiz. Bir de form etiketine enctype değerine dosya upload edeceğimiz için “multipart/form-data” parametresini ekleyeceğiz.
    PHP:
    <form action="gonder.php" method="post" enctype="multipart/form-data">
      <input type="file" name="dosya" />
      <input type="submit" value="Gönder" />
    </form>
    Bu formu tarayıcımızdan açtığımızda aşağıdaki gibi bir görüntü meydana gelmiş olacak. Ve gönder butonuna bastığımızda da dosyayı action parametresinde belirttiğimiz gonder.php sayfasına gönderecek.
    [attachment=44]
    Oluşturduğumuz bu form ile artık kullanıcılardan bize dosya transfer etme yolunu kurmuş olduk.
    PHP’ye gönderilen dosyaları kontrol edip yüklemek
    Şimdi gelelim dosyaların gönderileceği uygulamamıza, yani bizim örnekte gonder.php olarak adlandırdığımız sayfamıza.

    İlk olarak sayfamıza bir dosya gönderilmiş mi diye kontrol edeceğiz. Eğer sayfaya direkt girmeye çalışılırsa hiç bir şey yapmamamız gerekiyor. Sonrasında $_FILES global değişkenini kullanarak bize gönderilen dosyanın boyutuna, tipine ve uzantılarına bakacağız.

    Yine isset fonksiyonunu kullanarak bir dosya gönderilmiş mi diye bakacağız. Eğer gönderilmiş ise $_FILES global dizininde gönderilen dosya elementinin adında bir dizin oluşmuş olur. Yani form elementininin name parametresine yazdığımız isimimi kullanacağız. Biz formumuzu yaparken bu değere “dosya” yazmıştık.
    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.
    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.
    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.
    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.
    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.
    PHP:
    $dosya = $_FILES['dosya']['tmp_name'];
    copy($dosya, 'dosyalar/' . $_FILES['dosya']['name']);
    echo 'Dosyanız upload edildi!';
     

    Ekli dosyalar

    • html-upload-form.png
      html-upload-form.png
      1.2 KB · Görüntüleme: 186
    Üst Alt