PHP ile resim upload etme ve edilen resmi yeniden boyutlandırma işleminin nasıl yapıldığından bahsetmek istiyorum bu yazımda..
Burada daha çok ortaya hazır bir kod çıkartmaktan ziyade bu işlemin nasıl yapıldığını anlatmak ve okuyanların kendi yorumlarını ekleyerek daha gelişmiş uygulamalarda kullanabilmelerini sağlamak istiyorum..
Yapacağımız işlem bir form aracılığı ile JPEG formatında bir resmi upload etmek ve bunu sabit 300 genişlikte ve yükseklik-genişlik oranını sabit tutarak yeniden boyutlandırmak ve resimler/ klasörümüzde “yeniresim-Dosya Adı” adında oluşturmak.
Öncelikle upload edilecek resmi alacağımız html sayfasını hazırlayalım:
index.html
<html> <head> <title>;Resim Upload</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> <form name="upload" method="post" action="upload.php" enctype="multipart/form-data"> <input type="file" name="resim" id="resim" lang="tr" /><br /> <input type="submit" name="gonder" id="gonder" value="Yükle"/> </form> </body> </html>
Şimdi de bu formdan gelen resmi resimler klasörümüze kaydedip boyutunu 300px genişlikte olacak şekilde sabitleyelim:
upload.php
if ($_POST["gonder"] == "Yükle") { $kaynak = $_FILES["resim"]["tmp_name"]; // Yüklenen dosyanın adı $klasor = "resimler/"; // Hedef klasörümüz $yukle = $klasor.basename($_FILES['resim']['name']); if ( move_uploaded_file($kaynak, $yukle) ) { $dosya = "resimler/" . $_FILES['resim']['name']; $resim = imagecreatefromjpeg($dosya); // Yüklenen resimden oluşacak yeni bir JPEG resmi oluşturuyoruz.. $boyutlar = getimagesize($dosya); // Resmimizin boyutlarını öğreniyoruz $resimorani = 300 / $boyutlar[0]; // Resmi küçültme/büyütme oranımızı hesaplıyoruz.. $yeniyukseklik = $resimorani*$boyutlar[1]; // Bulduğumuz orandan yeni yüksekliğimizi hesaplıyoruz.. $yeniresim = imagecreatetruecolor("300", $yeniyukseklik); // Oluşturulan boş resmi istediğimiz boyutlara getiriyoruz.. imagecopyresampled($yeniresim, $resim, 0, 0, 0, 0, "300", $yeniyukseklik, $boyutlar[0], $boyutlar[1]); // Yüklenen resmimizi istediğimiz boyutlara getiriyoruz ve boş resmin üzerine kopyalıyoruz.. $hedefdosya="resimler/yeniresim-" . $_FILES['resim']['name']; // Yeni resimin kaydedileceği konumu belirtiyoruz.. imagejpeg($yeniresim, $hedefdosya, 100); // Ve resmi istediğimiz konuma kaydediyoruz.. //Kaydettiğimiz yeni resimin yolunu $hedefdosya değişkeni taşımaktadır.. chmod ($hedefdosya, 0755); // chmod ayarını yapıyoruz dosyamızın.. echo '<html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>Resim Upload</title> </head> <body> Resminiz başarıyla yüklenmiştir..<br /> <img src="' .$hedefdosya .'" alt="Yükelenen Resim" border="0" /> </body> </html>'; } else echo "Resim Yüklenemedi"; // Eğer resim yüklenemediyse move_uploaded_file fonksiyonundan değer false olacağından bu hatayı yazdırırız ekrana } else header ("Location: index.html"); ?>
Kodlar içerisinde de gerekli açıklamaları yaptım ancak yine de kodlarımızı biraz açıklamakta fayda var sanıyorum..
Öncelikle 2. satırda post değerlerinin dönüp dönemediğine bakıyoruz. Eğer formdan post yoluyla değer almıyorsak index.html dosyamıza yönlendiriyoruz sayfamızı. Ardından formdan gelen tek değer olan resim dosyamızı $kaynak değişkenine atıyoruz. Dosyamızı yükleyeceğimiz klasörün yolunu da $klasor değişkenimize atıyoruz. Ve de $yukle değişkenimizle dosyamızın yeni yerini belirtiyoruz. move_uploaded_file fonksiyonu yüklenen dosyayı 1. parametre olarak alır ve 2. parametresinde de yeni yolunu ister bizden. Bu fonksiyon bir true/false fonksiyondur ve eğer yüklenen dosya istediğimi konuma aktarıldıysa true değerini verir. Burada dosyanın yüklenme işlemi bitmiştir..
Resmimizi boyutlandırma işlemi if bloğumuz içerisinde kalan kısımdadır. $dosya değişkenimize yeniden boyutlandırılacak resmimizin yolunu verdik. $resim değişkenimize de imagecreatefromjpeg fonksiyonuyla yeni oluşturduğumuz resmimizi atadık. Bu fonksiyon JPEG formatındaki resimlerde kullanılır GIF,PNG formatındaki resimler için imagecreatefromgif, imagecreatefrompng fonksiyonları kullanılabilir. $boyutlar değişkenine getimagesize fonksiyonu ile resim dosyamızın boyutlarını aldık. Bu değişken bir dizi değişkendir ve ilk değeri genişlik ikinci değeri yüksekliktir. Daha sonraki 2 satırda resmin genişliğini 300 olacak şekilde yüksekliğin alması gereken değeri hesaplıyoruz. $yeniresim değişkenimize imagecreatetruecolor fonksiyonu ile istediğimiz yeni boyutlarda bir resim oluşturuyoruz. imagecopyresampled fonksiyonu ile oluşturduğumuz resme yüklediğimiz resmi yeni boyutlarına indirilmiş hali ile kopyalıyoruz. $hedefdosya değişkenine verdiğimiz değer ise oluşturduğumuz yeni resmin yolu. imagejpeg fonksiyonu ise yaptığımız tüm bu işlemlerin sonucunda oluşan resmin çıktısını alıp istediğimiz yolakaydetmemizi sağlar. Burada fonksiyonun 3. parametresi olan 100 resim kalitesidir. Eğer alan sıkıntısı çekiyorsanız kaliteyi düşürebilirsiniz. Ayrıca yine bu fonksyion JPEG formatındaki resimlerde kullanılır. GIF,PNG formatındaki resimler için imagegif, imagepng fonksiyonlarını kullanabilirsiniz. Son olarak bazı sunucular default CHMOD olarak yetersiz izinler atıyor dosyalara. Yazacağımız kodların her ortamda çalışabilmesi için chmod fonksiyonu ile dosya izni ayarlarını da yapıyoruz..
İşlemler bu kadar tabi benim yaptığım balık tutmayı anlatmaya çalışmak.. Sadece bu kodlar sizi tatmin etmiyecektir. Özellikle her formattaki resmi şekillendirecek güvenlik önlemlerini alacak bir script yazmayı size bırakıyorum..
Kolay gelsin…

PHP ile Resim Upload ve Yeniden Boyutlandırma için 34 cevap
berk 03 Ocak 2009
eline emegine saglık…
yakuter 18 Şubat 2009
Yazı güzel, anlatım güzel, örnek güzel. Tek sorun örneğin kodlarının birbirine girmiş olması. Satır aralığı artırılarak veya alınacak vb. tedbirlerle sunuş daha iyi yapılabilir.
Her şeye rağmen oldukça faydalı bir makale. Ellerine sağlık.
Muhittin Özer 19 Şubat 2009
Teşekkürler.
Haklısınız biraz öyle oldu, blog yazmaya ilk başladığım zamanlarda yazmıştım bu yazıyı biraz acemlik
Şimdi de çok iyi yazdığım söylenemez ama en azından daha düzenli yazmaya çalışıyorum..
ilhami 25 Şubat 2009
eywallah baya aradım ama bundan daha iyisini bulamadım çok saol iyi oldu. Bide upload ederken sadece jpeg yapıyor bunu dışında gif,png leri nasıl upload edecem yani bir kopyasını nasıl oluşturacam
Muhittin Özer 25 Şubat 2009
“… GIF,PNG formatındaki resimler için imagecreatefromgif, imagecreatefrompng fonksiyonları kullanılabilir. …”
“… GIF,PNG formatındaki resimler için imagegif, imagepng fonksiyonlarını kullanabilirsiniz. …”
Yazı içerisinde geçiyor nasıl yapılabileceği.
Ayrıca http://www.php.net/manual/tr/book.image.php adresinde PHP Manual’de yer alan image fonksiyonlarını bulabilir ve inceleyebilirsiniz.
Burak 12 Mayıs 2009
Anlatım İçin Saol kardeş ama bu çalışmadı bende. Hazır Çalışan Dosyaları nasıl alabilirim sizden. Bu konu şuanda çok lazım yardımlarını beklıyorum.
Elmalı 04 Haziran 2009
hocam verdiğin örnek çalışmıyor. hata veriyor…
Muhittin Özer 05 Haziran 2009
Arkadaşlar bu kodların çalışması için sunucu ayarlarının yapılması gerekebilir. Bu ayarlara CHMOD izinlerinden tutun PHP resim işleme fonksiyonlarının çalışmasına izin verilmesine kadar birçok kriter var. En basitinden
http://tr.php.net/manual/tr/function.imagecreatefromjpeg.php
adresinden imagecreatefromjpeg() fonksiyonunun çalışması için gereken şartları inceleyebilirsiniz. Bu kodları ben sunucumda çalıştırabiliyorum. Ama her kod her sunucu ayarında çalışmayabilir. Bunun için kodları kopyala/yapıştır mantığıyla kullanmak yerine anlatılanları anlamaya ve kavramaya çalışmak lazım. Bunun için PHP Manual gibi müthiş bir kaynak var.
okan öztürk 15 Temmuz 2009
teşekkürler nasıl yardımcı oldunuz bilemezsiniz
İbrahim Tanrıverdi 01 Ağustos 2009
Gerçekten çok teşekkür ediyorum.
Ben kitaplardan ve başka sitelerden bu işi yapan kodları bulmuştum ama resmin kalitesini aşırı derecede bozuyordu. Bu kodda öyle bir sıkıntı yok.
İyi günler, iyi çalışmalar dilerim.
serkan özgür 16 Eylül 2009
cok saol tamda acil gerekiyordu ama resimi yüklüyor ama 8 satırda hata veriyor Call to undefined function: imagecreatefromjpeg() in bu hatayı tekrar teşekkürler yardımcı olursan sevinirim
fatih 02 Aralık 2009
kardeş iyi, güzel, hoşda, birde ben başka bişey istesem bu resimin kopyalanan resimin adresini ve adını veritabanına kopyalanıp veritabanından tekrar nasıl okuturuz yardımcı olurmusun
sercan 08 Aralık 2009
kodları sorunsuz çalıştırdım..Fakat resmin kucuk hali simsiyah cıkıyor sorun nerde olabilir?Baya bi bakındım ama bulamadım..
kodlar için teşekkurler,iyi çalışmalar
refik 07 Ocak 2010
Şu Hata Benden Mi Kaynaklı Sizce*
Warning: imagejpeg(): Unable to open ’47.jpg’ for writing: Permission denied in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 112 Warning: chmod(): No such file or directory in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 117 Warning: getimagesize(47.jpg): failed to open stream: No such file or directory in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 120 Warning: imagejpeg(): Unable to open ‘../47.jpg’ for writing: Permission denied in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 112 Warning: chmod(): No such file or directory in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 117 Warning: getimagesize(../47.jpg): failed to open stream: No such file or directory in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 120 Warning: Cannot modify header information – headers already sent by (output started at /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php:112) in /home/sehitkemal/domains/menemensehitkemal.k12.tr/public_html/panel/yukle.php on line 139
Muhittin Özer 07 Ocak 2010
@refik: dosya izinlerini kontrol edin.
Muhittin Özer 07 Ocak 2010
@sercan: GD kütüphaneleri yüklü olmayaabilir.
Muhittin Özer 07 Ocak 2010
@fatih: Kod ve yazı içinde dosya isimlerinin hangi değişkenlerde atanmış olduğu geçiyor. Veri tabanı işlemleri farklı bir konu burdan ona hiç girmeyelim.
dorem 30 Mart 2010
gerçekten çok iyi bir örnek ve anlatım, bayadır resim upload olayına kafayı takmıştım… kodların devamını bekleriz.
guest 05 Mayıs 2010
sadece jpeg için olması biraz kötü ama süper çalışıo
Muhittin Özer 05 Mayıs 2010
@guest: Yazı içerisinde gif ve png için de hangi fonksiyonların kullanıldığı anlatılıyor.
guest 07 Mayıs 2010
merhaba kodunuzu png için editledim; ancak hata alıyorum.. aynı kodlama gif ve jpeg de sorun çıkarmaz iken sizce neden png de hata alıyorum, png nin özel bi durumumu var acaba ben çok hakim değilim de bu tür konulara.. en alta aldığım hataları ekliyeceğim
$resim=imagecreatefrompng($dosya);
$boyutlar=getimagesize($dosya); // Resmimizin boyutlarını öğreniyoruz
$resimorani=300/$boyutlar[0]; // Resmi küçültme/büyütme oranımızı hesaplıyoruz..
$yeniyukseklik=$resimorani*$boyutlar[1]; // Bulduğumuz orandan yeni yüksekliğimizi hesaplıyoruz..
$yeniresim=imagecreatetruecolor(“300″,$yeniyukseklik); // Oluşturulan boş resmi istediğimiz boyutlara getiriyoruz..
imagecopyresampled($yeniresim, $resim, 0, 0, 0, 0, “300″, $yeniyukseklik, $boyutlar[0], $boyutlar[1]);
// Yüklenen resmimizi istediğimiz boyutlara getiriyoruz ve boş resmin üzerine kopyalıyoruz..
$hedefdosya=”$klasor$file2″.”$kod3″.$_FILES['resim']['name']; // Yeni resimin kaydedileceği konumu belirtiyoruz..
imagepng($yeniresim,$hedefdosya,100);
chmod ($hedefdosya, 0755); // chmod ayarını yapıyoruz dosyamızın..
aldığım hata;
Warning: imagepng() [function.imagepng]: gd-png: fatal libpng error: zlib failed to initialize compressor — stream error in upload.php on line 72
Warning: imagepng() [function.imagepng]: gd-png error: setjmp returns error condition in upload.php on line 72
Warning: imagecreatefrompng() [function.imagecreatefrompng]: gd-png: fatal libpng error: Read Error: truncated data in upload.php on line 75
Warning: imagecreatefrompng() [function.imagecreatefrompng]: gd-png error: setjmp returns error condition in upload.php on line 75
Warning: imagecreatefrompng() [function.imagecreatefrompng]: ‘resimler/594865dMercury_Earth_Comparison.png’ is not a valid PNG file in upload.php on line 75
Warning: imagecopyresampled() expects parameter 2 to be resource, boolean given in upload.php on line 80
Warning: imagepng() [function.imagepng]: gd-png: fatal libpng error: zlib failed to initialize compressor — stream error in upload.php on line 83
Warning: imagepng() [function.imagepng]: gd-png error: setjmp returns error condition in upload.php on line 83
guest 07 Mayıs 2010
kusura bakmayın size sordum ama çözümü kendim buldum şu satırı değiştirince düzeldi
imagepng($yeniresim,$hedefdosya,100); // png de sorun yaratıyo
imagepng($yeniresim,$hedefdosya,9); // sorunsuz çalışabiliyor
berat 17 Ağustos 2010
herşey iyi hoşta
Resim Upload
Resminiz başarıyla yüklenmiştir..
<img src="” alt=”Yükelenen Resim” border=”0″ />
ne tarz bir yanlışlık var kontrol edersin artık biraz daha özenseniz daha iyi olur…
chaizar 25 Eylül 2010
oldukça işime yaradı; çok sağol..
tufan 21 Aralık 2010
fatih arkadaş senin sorun için…
$kaynak = $_FILES["profilresim"]["tmp_name"];
$resimname = $_FILES["profilresim"]["name"];
$rtipi = $_FILES["profilresim"]["type"];
$rboyut = $_FILES["profilresim"]["size"];
$ruzanti = substr($resimname, -4);
$yeniad = substr(uniqid(md5(rand())),0,35);
$sonSekil = $yeniad.$ruzanti;
$hedef = “images/user/avatar”;
$klasor = $kaynak;
$yukle = $resimname;
if(move_uploaded_file($kaynak,$yukle)){
$dosya = $resimname;
$resim = imagecreatefromjpeg($dosya); // Yüklenen resimden olusacak yeni bir JPEG resmi olusturuyoruz..
$boyutlar = getimagesize($dosya); // Resmimizin boyutlarini ögreniyoruz
$resimorani = 300/$boyutlar[0]; // Resmi küçültme/büyütme oranimizi hesapliyoruz..
$yeniyukseklik = $resimorani*$boyutlar[1]; // Buldugumuz orandan yeni yüksekligimizi hesapliyoruz..
$yeniresim = imagecreatetruecolor(“300″,$yeniyukseklik); // Olusturulan bos resmi istedigimiz boyutlara getiriyoruz..
imagecopyresampled($yeniresim, $resim, 0, 0, 0, 0, “300″, $yeniyukseklik, $boyutlar[0], $boyutlar[1]);
// Yüklenen resmimizi istedigimiz boyutlara getiriyoruz ve bos resmin üzerine kopyaliyoruz..
$hedefdosya = “$hedef/$sonSekil”;
imagejpeg($yeniresim,$hedefdosya,100); // Ve resmi istedigimiz konuma kaydediyoruz..
//Kaydettigimiz yeni resimin yolunu $hedefdosya degiskeni tasimaktadir..
$updateEdenUye = new dbSorgu;
$uyeid = $updateEdenUye->oturumAcanUye($oturumAcanUyeID);
$avatarGuncelle = @mysql_query(“UPDATE “.$photoUpdate->dbprefix.”_uyeler SET avatar=’$sonSekil’ WHERE uyeid=’$uyeid’”);
tufan 21 Aralık 2010
muhittin hocam, elinize sağlık demeyi unuttum
iyi çalışmalar
emre 24 Aralık 2011
selamlar, upload yapıyor ancak hedef klasöre resmin aynısını da koyuyor bunun olmasını istemiyorum ne yapabilirim?
Muhittin Özer 25 Aralık 2011
@emre:
unlink($dosyaismi);
komutuyla istediğiniz dosyayı silebilirsiniz.
yorum 28 Ocak 2012
Güzel paylaşım emeğine sağlık.
Selahattin 03 Şubat 2012
marhaba, hocam anlatım güzel olmuş. ancak takıldığım bir nokta var. yine resmin adını tutan değişkeni bir türlü bulamadım denemediğim şey kalmadı
ben projemde yüklenen resme benim belirleyeceğim yeni bir ad vermek istiyorum mesela bir sayaç kullanarak filan. sonra iki mesaj yukarıda verdiğin silme komutuyla dosyayı silicem.
Bunun yanında diğer bir sorun da, kodlar bilgisayarımda çalıştı ama sunucuya gönderdiğimde tam da dediğin gibi “resmi yükleyemedim” cevabını aldım. izinler filan galiba. bu ayarlar için hosting firmasına mı sormam gerekir yoksa benim yapmam gereken ayarlar mıdır bunlar?
Muhittin Özer 03 Şubat 2012
Selahattin Bey,
Yeni resmin adresi $hedefdosya değişkeninde mevcut, dosya yüklenemediyse hedef klasörün yazma iznini kontrol etmelisiniz. FTP arayüzünden bu izinleri görüntüleyebilir ve düzenleyebilirsiniz.
Selahattin 03 Şubat 2012
Çok çok teşekkürler.
Resmin adını tutan değişkeni bulmuştum buraya yazdıktan sonra
Bu izin olayı da gerçekten basit bir hataymış hiç aklıma gelmemişti sağ tıklayıp yazma izinlerini vermek
bunların yanında bir sorum daha var
Şimdi;
Gelen resmin uzantısını str fonksiyonlarıyla tespit edip switch case sorgusu içinde, ona göre imagecratefromXXX() şeklindeki fonksiyonlardan birini kullandım. ve kaydederken de hepsini gif olarak kaydediyorum.
Burda kaynağı; jpg,png ve gif olan dosyalarda sorun çıkmadı. ama bmp olarak gönderdiğim dosyayı gif olarak kaydederken siyaha boyadı resmi
Buna bir çözüm bulabilir miyim? yoksa siteye bmp uzantılı dosyaları yüklemeyi yasaklayim mi dersiniz?
Muhittin Özer 03 Şubat 2012
BMP uzantılı dosyaların işlenebilirliği hakkında fikrim yok. PHP manual’e bakabilir veya Google’da bir arama yaparak sonuca ulaşabilirsiniz.