5 Mart 2015 Perşembe

CodeIgniter - 3 - Resim Upload Etmek


Upload Meselesi


Buraya kadar olan yayınlarımı okuduysanız, codeigniter kurulumu hakkında bilgi sahibisiniz demektir.

Eğer okumadıysanız, şu linklerden ulaşabilirsiniz:
Yayın 1 - Merhaba Dünya
Yayın 2 - Template Sistemi

CodeIgniter'a yeni başlayanların merak ettikleri, çözüm bulmakta zorlandıkları bir konu hakkında bilgi vermek istiyorum. Nasıl resim upload ederiz? Bu iş çok basit. Ben de mümkün olduğunca, işinize yaramayacak kodları kullanmadan anlatıyorum:

Öncelikle bir view dosyası oluşturalım. application/views/ altına resimyukle_view.php adında bir dosya açalım. Burada, resim upload edeceğimiz bir formumuz olacak. Resmi POST ettiğimizde de yine aynı sayfa görüntülenecek ve "Resim başarıyla yüklendi!" mesajı verecek.

<html>
    <head>
        <title>Upload</title>
        <base href="http://localhost/site.com/" />
    </head>
    <body>
        <div><?=$bilgi?></div>
        <form action="resimyukle/yukle" method="post" enctype="multipart/form-data" >
            <div><strong>Resim Seçin:</strong> <input type="file" name="resim" /></div>
            <div><input type="submit" value="Yükle" /></div>
        </form>
    </body>
</html>

Böylelikle bir formumuz oldu. Bu view sayfası, resimyukle adlı controller'a bağlı. Bu controller'ımızı da oluşturalım. application/controllers/ klasörü içine resimyukle.php adlı bir dosya oluşturun ve şunları yazın:

<?php if ( ! defined('BASEPATH')) exit('No direct script access allowed');

class resimyukle extends CI_Controller
{
        public function __construct() { parent::__construct(); }

        public function index()
        {
            $data['bilgi'] = '';
            $this->load->view('resimyukle_view', $data);
        }

        public function yukle()
        {          
            $config['upload_path'] = 'assets/images/'; // dosyayı upload edeceğimiz klasör
            $config['allowed_types'] = 'gif|jpg|jpeg|png';                // izin verilen dosya uzantıları
            $config['file_name'] = 'Resim';                                      // dosya hangi adla kaydedilsin?

            $this->load->library('upload', $config);               // CodeIgniter'ın upload sınıfını yükledik
            $sonuc = $this->upload->do_upload('resim');     // Dosyamızı upload ediyoruz.
         
            if($sonuc) $data['bilgi'] = 'Resim başarıyla yüklendi!';
            else $data['bilgi'] = 'Resim yüklenemedi. Hata Mesajı: '.$this->upload->display_errors();

            $this->load->view('resimyukle_view', $data);
        }
}

İşe bu kadar. Ama kafanıza takılan sorular var... Yüklediğimiz resim, "Resim" adıyla kaydoluyor. Peki ya yine resim yüklemek istersek, o da mı "Resim" adıyla kaydedilecek (yani üzerine mi yazılacak)? Hayır. Eğer yeni bir resim upload edilirse, klasörde "Resim" adlı başka bir resim dosyası olduğundan, Resim1 olarak kaydedecektir. (dosya uzantısını kendisi ekliyor) Ama eğer istersek bir ayar yapıp, aynı adlı dosyanın üzerine yazılmasını da sağlayabiliriz.

Şimdi biraz detaylandıralım.

1) $config adlı bir dizi kullandık ve upload kütüphanemizi yüklerken, bu diziyi de parametre olarak belirttik. Bu dizinin ne işe yaradığını anlamışsınızdır zaten. Upload işleminin ayarlarını belirtiyoruz. Peki bu ayarlara başka nasıl parametreler verebilirdik? Buyrun, ellislab.com sitesinden aldığım tabloyu kendimce Türkçe'ye çevirdim:

ÖzellikVarsayılan DeğerTürAçıklama
upload_pathNone(string)Resmi hangi klasöre kaydedeceğiz?
Tam yol vermemiz gerekiyor.
allowed_typesNone(string)Hangi dosya uzantılarına izin vereceğiz?
Örnek: 'gif|jpg|jpeg|png'
file_nameNone(string)Eğer bu parametreye (üstteki örnekte 'Resim'  dediğimiz gibi) bir değer verirsek, dosyayı bu isimle kaydeder.
Eğer parametre vermezsek, dosyayı orijinal adıyla kaydeder.
(Uyarı: Türkçe karakterlerde sorun yaşarsınız)
overwriteFALSETRUE/FALSE
(boolean)
Adı üzerinde. Kaydedilen dosyayla aynı dosya adına sahip başka dosya varsa, üzerine yazılsın mı?
max_size0(int)KB cinsinden, izin verilen maksimum dosya boyutu.
0 verilirse, limitsiz kabul edilir.
(PHP'nin verdiği limit başka bir mevzu tabii ki...)
max_width0(int)Piksel cinsinden, izin verilen maksimum genişlik değeri.
0 verilirse, limitsiz kabul edilir.
max_height0(int)Piksel cinsinden, izin verilen maksimum yükseklik değeri.
0 verilirse, limitsiz kabul edilir.
max_filename0(int)Dosya adının uzunluğu en fazla kaç karakter olsun?
0 verilirse, limitsiz kabul edilir.
encrypt_nameFALSETRUE/FALSE
(boolean)
Hiç kullanmadım ama sanırım true yapılırsa, dosya adını rastgele şifreli bir adla değiştiriyor.
remove_spacesTRUETRUE/FALSE
(boolean)
Dosya adındaki boşluklar silinsin mi?

2) Yükleme işlemi başarılı olduğunda, yüklenen dosyayla ilgili hangi verilere ulaşabiliriz? Öyle ya, dosyamız yüklendikten sonra bu dosyayı veritabanına da yazmak isteyebiliriz. O halde, kaydedilen resim adını bir değişkene atabilmek isteriz.

$this->upload->do_upload(); fonksiyonumuzdan true dönmüşse, yani resim başarıyla kaydedilmişse, $this->upload->data() komutuyla bize sunulan dizi ile, şu bilgilere ulaşabiliriz:

$bilgiler = $this->upload->data();

$resmin_orijinal_adi = $bilgiler['orig_name'];

$yuklenen_resmin_adi = $bilgiler['raw_name'].$bilgiler['file_ext'];

$yuklenen_klasor_yolu = $bilgiler['file_path'];  //  assets/images/

$yuklenen_dosya_yolu = $bilgiler['full_path'];  //   assets/images/Resim.jpg

$resim_uzantisi = $bilgiler['file_ext'];  //   .jpg

$resim_mi = $bilgiler['is_image'];  //   1

$resim_width = $bilgiler['image_width'];  //   800

$resim_height = $bilgiler['image_height'];  //   600

$img_icin_genislik = $bilgiler['image_size_str'];  // width='800' height='200'
//Bunu da bir img tagına kolayca yazabilelim diye yapmışlar herhalde.

Umarım bir yardımım dokunmuştur. Yorumlarınızı beklerim.
 Başka yayınlarda görüşmek üzere...

4 yorum:

  1. aynılarını yaptım ama ne resim yüklenmiştir mesajı geldi ne de hata mesajı yüklenenler klasörüne baktım resim yüklenmemiş

    YanıtlaSil
    Yanıtlar
    1. Yazarken bir iki hata yapmışım sanırım.
      Kodları yukarıdaki şekilde denedim, çalışıyor.
      Tekrar deneyebilirsiniz.
      Sorun yaşarsanız yardımcı olmaya çalışırım.
      İyi günler.

      Sil
  2. hocam resim yükleme yolunu bulamıyor her türlü yolu denedim her klasörün içine images diye klasör oluşturdum yine de dosya yolu bulunamadı hatası veriyor bi yardımcı olsan

    YanıtlaSil
  3. application/config/autoload.php içinde $autoload['helper'] = array(); içine url yazın $autoload['helper'] = array('url');

    YanıtlaSil

Site Haritası

CodeIgniter Yayınları 1. Merhaba Dünya : CodeIgniter'da Merhaba Dünya yazısını görün... 2. Template Sistemi : CodeIgniter ile sta...