Symfony Image Resize

By | 21 November 2016

Symfony için upload edilen resim dosyalarını kalitesi bozulmadan istediğimiz boyutlarda resize eden güzel bir bundle’dan bahsedeceğim. Örneği Symfony2.8 ve Symfony3.1 için denedim. Bunun için Gregwar/ImageBundle kullanıyorum. Öncelikle kurulum için composer.json dosyasımıza dökümantasyon gibi require altına aşağıdaki satırı ekliyorum. Bu yazı yazılırken son sürümü; “2.1.2” bunu da deneyebilirsiniz.

"gregwar/image-bundle": "dev-master"

Ardından “composer update” dedikten sonra Symfony projemize gerekli olan bundle ekleniyor. Ardından AppKernel.php dosyasında bundles array’i içine aşağıdaki satırı ekliyoruz.

new Gregwar\ImageBundle\GregwarImageBundle(),

Son konfigürasyonumuz için config.php dosyamıza dökümantasyondaki gibi aşağıdaki satırı ekliyoruz.

gregwar_image: ~

ImageBundle için diğer konfigürasyonlar için dokümantasyonu okuyabilirsiniz, orada image cache kullanacaksanız ayarlar da yapabilirsiniz.

Konfigürasyon işlemi bittiğine göre kullanmaya başlayabiliriz. Benim basit bir Html Form sayfam var ve burada resim dosyası upload edebiliyoruz.

image-upload screen-shot-2016-11-21-at-1-20-07-pm

Ardından controller tarafını aşağıdaki gibi düzenliyorum ve kodları açıklamalarıyla birlikte okuyabilirsiniz.

class DefaultController extends Controller
{
    /**
     * @param Request $request
     * @return bool|string
     *
     * @Route("/upload", name="upload")
     */
    public function uploadAction(Request $request)
    {
        $logo = $request->files->get('logo');
        //Gelen dosya istenilen formatta mı kontrol ediyorum.
        if ($logo) {
            if (!$logo instanceof UploadedFile) {
                die('Dosya upload edilemedi.');
            }
            //burada dosya adını ve uzantısını ayırıyorum ve array'e atıyorum.
            $nameArray = explode('.', $logo->getClientOriginalName());
            $fileType = $nameArray[sizeof($nameArray) - 1];
            //dosya uzantısı verdiğim array içinde var mı kontrol ediyorum.
            $validFiletypes = array('jpg', 'jpeg', 'png');
            if (in_array(strtolower($fileType), $validFiletypes)) {
                //dosya adını uniqid veriyorum ve uzantısı ile birleştiriyorum.
                $fileName = uniqid() . '.' . $nameArray[1];
                //gregwar/image-bundle kullanarak dosyanın gerçek path'ini alıp, resize ediyorum, sonra web/upload/ içine kaydediyorum.
                $this->get('image.handling')->open($logo->getRealPath())
                    ->cropResize(300, 300)
                    ->save('upload/' . $fileName);
            } else {
                die('Resim formatı desteklenmiyor.');
            }
        }
        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->getParameter('kernel.root_dir') . '/..') . DIRECTORY_SEPARATOR,
        ]);
    }


}

Dosyayı upload ettikten sonra aşağıdaki gibi bir çıktı alıyorum. Sağ üstten width ve height değerlerini, sol üstten de dosya adını görebilirsiniz. Bu şekilde hangi boyutta resim upload edilsin farketmez, kalite kaybetmeden bizim istediğimiz boyutlarda olmasını sağlayabiliriz.

screen-shot-2016-11-21-at-1-25-28-pm

 

Leave a Reply

Your email address will not be published. Required fields are marked *

*