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">
</meta></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
< ?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..
?>
<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="<?php echo $hedefdosya; ?/>" alt="Yükelenen Resim" border="0" />
</body>
</html>
< ?php
}
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…
eline emegine saglık…
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.
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..
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
“… 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.
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.
hocam verdiğin örnek çalışmıyor. hata veriyor…
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.
teşekkürler nasıl yardımcı oldunuz bilemezsiniz
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.
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
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
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
Ş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
@refik: dosya izinlerini kontrol edin.
@sercan: GD kütüphaneleri yüklü olmayaabilir.
@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.
gerçekten çok iyi bir örnek ve anlatım, bayadır resim upload olayına kafayı takmıştım… kodların devamını bekleriz.
sadece jpeg için olması biraz kötü ama süper çalışıo
@guest: Yazı içerisinde gif ve png için de hangi fonksiyonların kullanıldığı anlatılıyor.
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
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
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…