Maksimum Boyutlu Resim Yükleme ve Otomatik Boyutlandırma

Bu makalede, özel durumlarda yalnızca dosya yüklemek yeterli olmayabilir. Belirli bir maksimum boyutta resimleri kaydetmemiz gerekebilir. Resimleri manuel olarak yeniden boyutlandırmak pratik olmayabilir. Bu sorunu nasıl çözebileceğimizi görelim.

Bu örnekte sadece bir “upload” adlı klasör ve iki dosya oluşturacağız:

classupload.php: Bu dosya, resmi kaydeden, boyutunu kontrol eden ve gerektiğinde kaydedilen resmi yeniden boyutlandıran ve işlemlerin başarısızlık veya başarı durumunu döndüren UploadImage sınıfını içerir. index.php: Bu dosya, resmi gönderen input dosyasını içeren formu içerir. Bu dosyada UploadImage sınıfını çağırır ve işlemin sonucuna göre bir mesajı görüntüler.

<?php
class UploadImage {
    public $width; // index.php dosyasında belirlenen resmin maksimum genişliği
    public $height; // index.php dosyasında belirlenen resmin maksimum yüksekliği
    protected $types = array("jpeg", "png", "gif"); // Bu örnekte kullanılabilir resim tipleri

    // Resmi yeniden boyutlandıran fonksiyon
    protected function resizeImage($path, $filename) {
        // Yeni boyutları belirle
        $width = $this->width;
        $height = $this->height;

        // Orijinal genişlik, yükseklik ve resim türünü al
        list($width_orig, $height_orig, $type, $attribute) = getimagesize($path . $filename);

        // Eğer genişlik yükseklikten büyükse, genişliği orijinal genişliğe bölerek yüksekliği bu oranla çarp
        if ($width_orig > $height_orig) {
            $height = ($width / $width_orig) * $height_orig;
        } elseif ($width_orig < $height_orig) {
            // Eğer yükseklik genişlikten büyükse, yüksekliği orijinal yüksekliğe bölerek genişliği bu oranla çarp
            $width = ($height / $height_orig) * $width_orig;
        }

        // Yeni boyutlarla resmi oluştur
        $newImage = imagecreatetruecolor($width, $height);

        switch ($type) {
            case 1: // Eğer resim tipi gif ise
                $sourceImage = imagecreatefromgif($path . $filename);
                imagecopyresampled($newImage, $sourceImage, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
                imagegif($newImage, $path . $filename);
                break;

            case 2: // Eğer resim tipi jpg ise
                $sourceImage = imagecreatefromjpeg($path . $filename);
                imagecopyresampled($newImage, $sourceImage, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
                imagejpeg($newImage, $path . $filename);
                break;

            case 3: // Eğer resim tipi png ise
                $sourceImage = imagecreatefrompng($path . $filename);
                imagecopyresampled($newImage, $sourceImage, 0, 0, 0, 0, $width, $height, $width_orig, $height_orig);
                imagepng($newImage, $path . $filename);
                break;
        }

        imagedestroy($newImage); // Yeni resmi yok et
        imagedestroy($sourceImage); // Orijinal resmi yok et
    }

    protected function removeAccent($text) {
        // Aksanlı harfler
        $withAccent = array('à', 'á', 'â', 'ã', 'ä', 'å', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ñ', 'ò', 'ó', 'ô', 'õ', 'ö', 'ù', 'ü', 'ú', 'ÿ', 'À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ñ', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'O', 'Ù', 'Ü', 'Ú', 'Ÿ');
        // Aksansız harfler
        $withoutAccent = array('a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'n', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'y', 'A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'N', 'O', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'Y');
        $final = str_replace($withAccent, $withoutAccent, $text);

        $withPunctuation = array('´', '`', '¨', '^', '~', ' ', '-');
        $withoutPunctuation = array('', '', '', '', '', '_', '_');
        $final = str_replace($withPunctuation, $withoutPunctuation, $final);
        return $final;
    }

    public function save($path, $file) {
        $file['name'] = $this->removeAccent($file['name']);
        $uploadFile = $path . $file['name'];
        $type = strtolower(end(explode('/', $file['type'])));

        if (array_search($type, $this->types) === false) {
            $message = "<font color='#F00'>Sadece jpeg, png veya gif formatında resim yükleyin!</font>";
            return $message;
        } else if (!move_uploaded_file($file['tmp_name'], $uploadFile)) {
            switch ($file['error']) {
                case 1:
                    $message = "<font color='#F00'>Dosya boyutu izin verilen boyuttan büyük.</font>";
                    break;
                case 2:
                    $message = "<font color='#F00'>Dosya boyutu izin verilen boyuttan büyük.</font>";
                    break;
                case 3:
                    $message = "<font color='#F00'>Dosya kısmen yüklendi.</font>";
                case 4:
                    $message = "<font color='#F00'>Dosya yüklenmedi.</font>";
                    break;
            }
        } else {
            list($width_orig, $height_orig) = getimagesize($uploadFile);

            if ($width_orig > $this->width || $height_orig > $this->height) {
                $this->resizeImage($path, $file['name']);
            }

            $message = "<a href='" . $uploadFile . "'><font color='#070'>Yükleme başarılı!</font><a>";
        }

        return $message;
    }
}
?>

Yukarıdaki kod, UploadImage adında bir sınıf içerir. Bu sınıf, resimleri kaydetme, boyutlarını kontrol etme ve gerektiğinde yeniden boyutlandırma yeteneklerine sahiptir. Sınıfın ayrıntıları:

  • public $width ve public $height: Bu değişkenler, resmin maksimum genişliğini ve yüksekliğini belirtir. index.php dosyasında belirlenir.
  • protected $types: Bu dizi, bu örnekte kullanılabilen resim türlerini içerir: “jpeg”, “png” ve “gif”.
  • protected function resizeImage($path, $filename): Bu fonksiyon, resmin boyutunu yeniden boyutlandırır ve kaydeder. Maksimum genişlik ve yüksekliğe göre orantılı olarak boyutları hesaplar. Orijinal türüne göre resmi oluşturur ve kaydeder.
  • protected function removeAccent($text): Bu fonksiyon, verilen metindeki aksanlı harfleri kaldırır ve metni düzenler.
  • public function save($path, $file): Bu fonksiyon, resmi yükler ve boyutlarını kontrol eder. Eğer boyutlar belirtilen maksimum boyutlardan büyükse, resizeImage fonksiyonunu çağırarak resmi yeniden boyutlandırır. Yükleme işlemi başarılı veya başarısız olursa ilgili mesajı döndürür.

index.php dosyası şu şekildedir:

 

<!DOCTYPE html>
<html>
<head>
    <title>Resim Yükleme ve Boyutlandırma</title>
</head>
<body>
    <form method="post" name="form1" enctype="multipart/form-data" action="index.php">
        <fieldset>
            <legend>Resim Yükleme</legend>
            <strong>Fotoğraf:</strong>
            <input type="file" name="img" id="img" />
            <input type="submit" value="Yükle" />
            <input type="hidden" name="MAX_FILE_SIZE" value="1024000" />
        </fieldset>
    </form>
    <?php
    if (!empty($_FILES)) {
        include 'classupload.php';
        $upload = new UploadImage();
        $upload->width = 250;
        $upload->height = 250;
        echo $upload->save("upload/", $_FILES['img']);
    }
    ?>
</body>
</html>

Yukarıdaki kod, resim yükleme formunu ve form verilerinin işlenmesini içerir. Formun enctype özelliği multipart/form-data olarak ayarlandı, çünkü bir dosya yüklüyoruz. Form gönderildiğinde, $_FILES superglobal değişkeni içindeki resim verisini kullanarak UploadImage sınıfını oluşturur ve save fonksiyonunu çağırır. Sonuç olarak dönen mesajı ekrana basar.

Bu kodlar, resim yükleme ve boyutlandırma işlemlerini gerçekleştirmek için kullanılabilecek basit bir örnek sunar. Elbette gerçek uygulamalarda daha fazla hata kontrolü, güvenlik önlemleri ve iyileştirmeler yapılması gerekebilir.

Bu dosyada, resmimizi arayıp göndermek için kullanacağımız input dosyasını içeren formu () ve formu gönderen düğmeyi () içeren bir form bulunmaktadır. Formda dikkat edilmesi gereken bir özellik olan enctype özniteliğine (enctype=”multipart/form-data”) bir değer atadığımıza dikkat edin. Enctype’ın varsayılan değeri application/x-www-form-urlencoded’dır, ancak bu değeri multipart/form-data olarak değiştirdik çünkü bir dosyayı form aracılığıyla gönderiyoruz. Bu değişiklik olmadan, dosyamız gönderilmezdi.

Ayrıca, tarayıcıya izin verilen maksimum boyutu bildiren bir gizli alan () da bulunmaktadır. Bu sınırlamayı atlatabilmek kolaydır, bu nedenle php.ini dosyasında yükleme boyutu bir sınırlama içerir. Bazıları şunu sorabilir: Bu sınırlama nedeniyle niye işlem yapılır? Cevap basittir: Tarayıcıya maksimum bir boyut bildirerek, kullanıcının dosyanın sunucuya gönderilmesini beklemesine gerek kalmadan dosyanın çok büyük olduğunu öğrenmesini sağlamış oluruz.

Sonrasında, süper global değişken $_FILES boş değilse kontrol edilir (if(!empty($_FILES))). Boş değilse, UploadImagem sınıfını içeren dosya eklenir (include ‘classupload.php’;), sınıf çağrılır ($upload = new UploadImage();) , resmimizin maksimum genişliğini ($upload->width = 250;) ve yüksekliğini ($upload->height = 250;) belirleriz ve save fonksiyonundan dönen mesajı ekrana basarız (echo $upload->save(“upload/”, $_FILES[‘img’]);), parametre olarak resmimizin kaydedileceği yol (upload/) ve form tarafından gönderilen $_FILES[‘img’] süper global değişkenini geçeriz.

Yorum bırakın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


Scroll to Top
Share to...