Php ile resim yükleme işlemi kolay bir işlemdir. Yanlız eklenecek resimler 1 den çok olduğu zaman ekleyen kişi için ızdırap olup sinir sistemini alt üst etmektedir. Bu yazımızda çoklu resim yüklemenin en basit halini göreceğiz.
Öncelikle resim yüklemek için kullanacağımız verot.net ‘in class.upload.php eklentisini indirip proje dosyamızın içerisine atıyoruz. Daha sonra kullanacağımız dosyalarımızı oluşturuyoruz 2 dosya 1 klasör oluşturdum. Biri yükleme formumun bulunduğu index.php diğeri ise yükleme işlemlerimi yapacağım yukle.php olacak. Klasör ise yüklenecek resimler için oluşturduğum klasör (sunucu üzerinde bu klasör için dosya iznini verdiğinizden emin olun).
Yani oluşturduğumuz ve içine attığımız dosyalar ile birlikte projemizin içinde aşağıdaki dosyalar ve klasörler bulunmakta ;
- index.php
- yukle.php
- class.upload.php
- resimler klasörü.
Bu 2 dosyanın içindeki kodları yazı içinde değil kod blokları içerisinde açıklama satırı olarak teker teker açıklayacağım. Öncelikle index.php sayfamızın içinde formumuzu oluşturalım ;
index.php
<!-- ÖNCELİKLE FORM TAGIMIZI AÇIYORUZ ACTION=YUKLE.PHP , METHOD=POST VE ENCTYPE=MULTIPART/FORM-DATA OLARAK AYARLIYORUZ. --> <form action="yukle.php" method="post" enctype="multipart/form-data"> <fieldset> <legend>Resim Yükle</legend> <p> <label>Resimleri Seçiniz :</label> <!-- FİLE İNPUTUMUZU OLUŞTURUYORUZ BURADA DİKKAT EDİLECEK 2 NOKTA VAR ; 1. NAME KISMIMIZDA VERDİĞİMİZ İSMİN SONUNA [] KARAKTERLERİNİ YAZMAK , BU RESİMLERİMİZİ DİZİ HALİNDE YOLLAMAMIZI SAĞLAYACAK. 2. MULTİPLE=MULTİPLE YAZARAK RESİM SEÇERKEN CTRL YARDIMI İLE İSTEDİĞİMİZ KADAR RESİM SEÇEBİLECEĞİZ. (SON SÜRÜM TARAYICILARDA SORUN ÇIKARMAMAKTA) --> <input type="file" name="resim[]" multiple="multiple" /> </p> <!-- SON OLARAK SUBMİT BUTONUMUZU OLUŞTURUP FORM KISMINI BİTİRİYORUZ. --> <input type="submit" name="yukle" value="Resimleri Yükle" /> </fieldset> </form>
Daha sonra resimlerimizi yükleyip işleyeceğimiz yukle.php içerisine kodlarımızı yazalım ;
yukle.php
/* ÖNCELİKLE POST EDİLEN BİR FORMUMUZ VARMI KONTROL EDELİM */ if(isset($_^POST["yukle"])){ /* POST'UN BAŞINDAKİ ^ KARAKTERİNİ SİLİNİZ. */ /* DAHA SONRA CLASS.UPLOAD.PHP DOSYAMIZI SAYFAMIZA DAHİL EDELİM. */ require_once ('class.upload.php'); /* RESİMLERİMİZ DÖNGÜ İÇERİSİNDE UPLOAD EDECEĞİMİZ İÇİN ÖNCE KAÇ TANE RESİM GELMEKTE ONU BULUYOR VE $resim_sayisi DEĞİŞKENİNE ATIYORUZ. */ $resim_sayisi = count($_FILES["resim"]["name"]); /* FOR DÖNGÜMÜZÜ OLUŞTURUYORUZ $i DEĞİŞKENİ DİZİ İNDİSİMİZİ BELİRLEYECEK VE GELEN RESİM SAYISI KADAR DÖNGÜMÜZ DÖNDÜKÇE HER BİR DÖNÜŞTE 1 ARTACAK */ for($i=0; $i<$resim_sayisi; $i++) { /* FORMUMUZDAN GELEN RESİMLERİN BİLGİLERİNİ ALALIM */ $name = $_FILES["resim"]["name"][$i]; /* RESMİMİZİN İSMİ*/ $type = $_FILES["resim"]["type"][$i]; /* RESMİMİZİN DOSYA UZANTISI*/ $tmp_name = $_FILES["resim"]["tmp_name"][$i]; /* RESMİMİZİN GEÇİCİ DOSYA YOLU */ $error = $_FILES["resim"]["error"][$i]; /* RESMİM İLE İLGİLİ VARSA HATA KODU */ $size = $_FILES["resim"]["size"][$i]; /* RESMİMİZİN BOYUTU */ /* TÜM BU ALDIĞIMIZ BİLGİLERİ YÜKLEME YAPABİLMEK İÇİN ARRAY İÇERİSİNDE TOPLAYIP $resim İSMİNDE BİR DEĞİŞKENE ATIYORUZ. */ $resim = array('name' => $name , 'type' => $type , 'tmp_name' => $tmp_name , 'error' => $error ,'tmp_name' => $tmp_name , 'size' => $size); /* RESİMLERİN YÜKLENECEĞİ KLASÖR İSMİNİ $klasor DEĞİŞKENİNE ATIYORUZ */ $klasor = "resimler"; /* CLASS.UPLOAD.PHP İÇERİSİNDEKİ YÜKLEME FONKSİYONLARIMIZI KULLANMAYA BAŞLIYORUZ. */ /* SINIFIMIZI BAŞLATIYORUZ */ $yukle = new upload(@$resim); /* EĞER YÜKLEME İŞLEMİMİZ GERÇEKLEŞTİ İSE */ if($yukle->uploaded){ $yukle->process($klasor); /* RESMİMİZİN TAŞINACAĞI KLASÖR */ /* OPSİYONEL SEÇENEKLER VEROT.NET DEN DAHA FAZLA ÖZELLİĞE ULAŞABİLİRSİNİZ. */ $yukle->image_resize = true; /* RESİM BOYUTLANDIRMAYI AKTİFLEŞTİRİYORUZ */ $yukle->image_x = 250; /* GENİŞLİK DEĞERİ */ $yukle->image_y = 200; /* YÜKSEKLİK DEĞERİ */ /* OPSİYONEL İŞLEMLER BAŞARILI OLDU İSE */ if($yukle->processed){ /* YÜKLENEN DOSYA İSMİNİ ALIP $yuklenen_resim DEĞİŞKENİNE ATIYORUZ */ $yuklenen_resim = $yukle->file_dst_name; /* YÜKLENEN RESMİMİZİ EKRANA BASIYORUZ (BU KISIMDA VERİTABANINA DA YAZDIRABİLİRSİNİZ AMACINIZA UYGUN KULLANABİLİRSİNİZ.)*/ print '<img src="resimler/'.$yuklenen_resim.'" />'; /* EN SON $yukle DEĞİŞKENİMİZİ TEMİZLİYORUZ */ $yukle->clean(); } /* 3. İF BİTİŞ */ } /* 2.İF BİTİŞ */ } /* FOR BİTİŞ */ }/* 1.İF BİTİŞ */
Kullanılacak dosyalar ve açıklamaları yukarıda bulunmaktadır.Kodlar en basit halde yazılmış olup güvenlik göz ardı edilmiştir. class.upload.php dosyasının içindeki diğer fonksiyon ve özellikler ile resim üzerinde istediğiniz gibi oynama yapabilirsiniz. Gerekli dökümantasyona verot.net üzerinden ulaşabilirsiniz. Her hangi bir sorunu yorum olarak paylaşırsanız hep birlikte çözmeye çalışalım.
[24] Yorum var
Dosyalar nerede?
class.upload.php dosyasını verot.net den indirebilirsiniz. Diğer dosyaların kodları yazı içerisinde mevcut.
verot.net class.upload.php indir
Bende
yukle.php’de
bu satırda hata var diyor
if(isset($_^POST[“yukle”])){ /* POST’UN BAŞINDAKİ ^ KARAKTERİNİ SİLİNİZ. */
Özür dilerim postun başındaki ^karakterini silmemişim
Allah razı olsun. verdiğiniz örnek çok işime yaradı.
Peki bunları nasıl veritabanına kaydedecez
mesela 4 resim yukledik tablomuzda şöyle id ,resim_url,resim_adi Bu dört resminde bilgilerini nasıl alacaz
yukle.php ‘deki 48 satıra resmi yazdırmak yerine sql kodları ile veritabanına yazdıracaksınız. for içinde döneceği için hepsini yazacaktır.
Kjardeş emeğine sağlık,çok güzel anlatmıssın.Ben projemde bir sürü veriyle beraber (bi aracın marka,serii,model vs..) özellikleriyle beraber 8-10 tane resimi de aynı id’ye atmak istiyorum ama hakkından gelemedim.Senin bir önerin varsa,paylaşırsan çok memnun olurum.iyi çalışmalar
Resimler için ayrı bir tablo oluşturup araç id ile birlikte bu oluşturduğunuz tabloya kaydedebilirsiniz.
Örn ;
Araçların bulunduğu tablonda : AracId Marka Model seri
Resimlerin bulunduğu tabloda : ResimId AracId Resim
şeklinde.
Merhaba Ben Mysql ile kayıt etmek istiyorum , Fakat Sql bilgim olmadığı için kayıt yapamıyorum , Örnek Kodu Verebilir misin , Birde Açıklama Diye Bir Kısım Oluşturup Onunla Birlikte Nasıl Veritabanına Kayıt Ettircem .
Teşekkürler İyi Çalışmalar .
<?php
/* ÖNCELİKLE POST EDİLEN BİR FORMUMUZ VARMI KONTROL EDELİM */
if(isset($_POST["yukle"])){ /* POST'UN BAŞINDAKİ ^ KARAKTERİNİ SİLİNİZ. */
/* DAHA SONRA CLASS.UPLOAD.PHP DOSYAMIZI SAYFAMIZA DAHİL EDELİM. */
require_once ('class.upload.php');
/* RESİMLERİMİZ DÖNGÜ İÇERİSİNDE UPLOAD EDECEĞİMİZ İÇİN ÖNCE KAÇ TANE RESİM GELMEKTE ONU BULUYOR VE $resim_sayisi DEĞİŞKENİNE ATIYORUZ. */
$resim_sayisi = count($_FILES["resim"]["name"]);
/* FOR DÖNGÜMÜZÜ OLUŞTURUYORUZ $i DEĞİŞKENİ DİZİ İNDİSİMİZİ BELİRLEYECEK VE GELEN RESİM SAYISI KADAR DÖNGÜMÜZ DÖNDÜKÇE HER BİR DÖNÜŞTE 1 ARTACAK */
for($i=0; $i $name , ‘type’ => $type , ‘tmp_name’ => $tmp_name , ‘error’ => $error ,’tmp_name’ => $tmp_name , ‘size’ => $size);
/* RESİMLERİN YÜKLENECEĞİ KLASÖR İSMİNİ $klasor DEĞİŞKENİNE ATIYORUZ */
$klasor = “resimler”;
/* CLASS.UPLOAD.PHP İÇERİSİNDEKİ YÜKLEME FONKSİYONLARIMIZI KULLANMAYA BAŞLIYORUZ. */
/* SINIFIMIZI BAŞLATIYORUZ */
$yukle = new upload(@$resim);
/* EĞER YÜKLEME İŞLEMİMİZ GERÇEKLEŞTİ İSE */
if($yukle->uploaded){
$yukle->process($klasor); /* RESMİMİZİN TAŞINACAĞI KLASÖR */
/* OPSİYONEL SEÇENEKLER VEROT.NET DEN DAHA FAZLA ÖZELLİĞE ULAŞABİLİRSİNİZ. */
$yukle->image_resize = true; /* RESİM BOYUTLANDIRMAYI AKTİFLEŞTİRİYORUZ */
$yukle->image_x = 250; /* GENİŞLİK DEĞERİ */
$yukle->image_y = 200; /* YÜKSEKLİK DEĞERİ */
/* OPSİYONEL İŞLEMLER BAŞARILI OLDU İSE */
if($yukle->processed){
/* YÜKLENEN DOSYA İSMİNİ ALIP $yuklenen_resim DEĞİŞKENİNE ATIYORUZ */
$yuklenen_resim = $yukle->file_dst_name;
/* YÜKLENEN RESMİMİZİ EKRANA BASIYORUZ (BU KISIMDA VERİTABANINA DA YAZDIRABİLİRSİNİZ AMACINIZA UYGUN KULLANABİLİRSİNİZ.)*/
print ”;
/* EN SON $yukle DEĞİŞKENİMİZİ TEMİZLİYORUZ */
$yukle->clean();
} /* 3. İF BİTİŞ */
} /* 2.İF BİTİŞ */
} /* FOR BİTİŞ */
}/* 1.İF BİTİŞ */
?>
Resim Yükle
Resimleri Seçiniz :
Açıklama
Önce sql bilginizi geliştirmenizi öneririm, sql bilginiz olmadığı için verdiğim örnek açıklayıcı olmayacaktır.
Hocam Öncelikle aradığımız kısa ve öz bir kod , teşekkürlerimi sunuyorum fakat bir sorunla karşılaştım bunu veritabanına eklemek için hangi kodu ve sql cümlesini kullanacagım o konudada yardımcı olursanız sevinirim , İyi Çalışmalar Kolay Gelsin .
Emrah bey şimdi boyle bi sistem üzerine örnek olarakbir emlak sitesi yapıyorız diyelim iki adet veritabanımız var emlak ve resimler adında ilk önce index.php de ilanı ekledik daha sonra fotoekle.php sayfasına get ile emlak sayfasındaki id yi çekiyoruz resimleri ben şöyle kaydetmejk istiyorum resimler/id burda $klasor =”resimler”; buraya değişik olarak ne yazacaz
İlanın id’sine özel bir klasör oluşturmak istiyorsanız $klasor = “resimler/”.$id; şeklinde bir ekleme ile klasör oluşturup onun içine yükleyebilirsiniz.
Merhabalar öncelikle bu güzel paylaşımınız için teşekkür ederim..
bizlerle paylaşmış olduğunuz çoklu resim upload kodlarını ürün ekleme sayfamda kullanacağım
1-SORUM: veritabanına kayıt ederken aynı resmin tekrar yüklenmemesini istiyorum bunun için de resimin ilk yüklendiği yani sunucudaki resimler klasörüne atıldığı anda kontrol etmesini ve aynı resimin tekrar yüklenmemesini nasıl sağlarız. Mysql için basit biliyorum eşsiz seçilip yüklenme engellenebilir ama resim dosyası sunucuya yinede yüklenmiş olur. bunu nasıl ortadan kaldırabiliriz.
2.SORUM: Resimlerin ilk seçilip yüklenerek yükle.php sayfasında ekrana basıldığında
print “”;
kodları ekleyerek resimlerin daha küçük görünmesini sağladım burada altlarına sil butonu eklenip sunucudan da silinmesi sağlanabilirmi, nasıl ?
bu iki soruma cevap verebilirseniz çok ama çok sevinirim saygılar
Merhabalar , veritabanına kayıt ederken resmin ismini benzersiz yaparsanız sorundan kurtulursunuz class.upload.php kullandı iseniz örnekteki gibi resmin ismini kendi değiştirir sıkıntı çıkmaz.
Resimlerin küçük görünmesi için $foo->image_x ve $foo->image_y değişkenlerine boyutlandırmalarını vermeniz yeterli. Sil butonunu da ekleyip mysql delete ile kaydı silmeden önce unlink(dosyaninyolu/dosyaadi); şeklinde resmi silebilirsiniz.
emeğine sağlık hocam ne zamandır aklımda takılan bir soru işareti idi… çok güzel anlatmışssın
İşinize yaradı ise ne mutlu.
ben veri tabanına değilde mesela o eklediğim 25. ürünse 25 diye bir klasörün içine eklesin bunu nasıl yapabilirim ve bu dosyaları klasörden nasıl silebiliriz
Ürünün idsini yüklenecek klasöre eklerseniz bu söylediğinize ulaşabilirsiniz. Mesela ;
$klasor = “resimler/”.$urun_id;
gibi … silme işlemini de php unlink fonksiyonu ile aynı mantıkta yapabilirsiniz.
örneği deniyorum ama localde resimleri seçip butona tıkladıgımda post işlemi gerçekleşmio
enctype=”multipart/form-data” kısmını form tagınıza yazdığınızdan emin olun.
İlk satırda hata verdi $_POST[‘resim’]
yetine $_FILES[‘resim’] olacak o
Merhabalar Ramazan bey, kodları yanlış almış olabilirsiniz ilk satırda $_POST[‘yukle’] mevcut submit butonunuz name kısmına yukle yazarsanız kod hatasız çalışacaktır.