2013-02-12 17 views
6

trzeba zaimplementować funkcjonalność zmiany rozmiaru obrazu (najlepiej z rozszerzeniem biblioteki GD2) w Zend Framework 2.obraz rozmiaru ZF2

nie mogłem znaleźć żadnego komponentu/pomocnika do tego samego. Wszelkie referencje?

Jeśli chcę utworzyć, to gdzie powinienem go dodać. W starszej wersji Zend istniała koncepcja Action Helper, a co z Zend Framework 2?

Proszę zaproponować najlepsze rozwiązanie tutaj.

Odpowiedz

17

Obecnie używam Imagine wraz z Zend Framework 2 do obsługi tego.

  1. Instalacja Imagine: php composer.phar require imagine/Imagine:0.3.*
  2. utworzyć fabrykę serwisową Imagine (w YourModule::getServiceConfig):

    return array(
        'invokables' => array(
         // defining it as invokable here, any factory will do too 
         'my_image_service' => 'Imagine\Gd\Imagine', 
        ), 
    ); 
    
  3. Użyj go w logice (niniejszym mały przykład z kontrolerem):

    public function imageAction() 
    { 
        $file = $this->params('file'); // @todo: apply STRICT validation! 
        $width = $this->params('width', 30); // @todo: apply validation! 
        $height = $this->params('height', 30); // @todo: apply validation! 
        $imagine = $this->getServiceLocator()->get('my_image_service'); 
        $image = $imagine->open($file); 
    
        $transformation = new \Imagine\Filter\Transformation(); 
    
        $transformation->thumbnail(new \Imagine\Image\Box($width, $height)); 
        $transformation->apply($image); 
    
        $response = $this->getResponse(); 
        $response->setContent($image->get('png')); 
        $response 
         ->getHeaders() 
         ->addHeaderLine('Content-Transfer-Encoding', 'binary') 
         ->addHeaderLine('Content-Type', 'image/png') 
         ->addHeaderLine('Content-Length', mb_strlen($imageContent)); 
    
        return $response; 
    } 
    

Jest to oczywiście „quick and dirty” sposób, ponieważ należy zrobić następujące (opcjonalne, ale dobrą praktyką do ponownego użycia):

  1. prawdopodobnie obsługiwać transformacje obrazu w usłudze
  2. pobierać obrazy z serwisu
  3. użyć filtr wejściowy do sprawdzania plików i parametry
  4. wyjście cache (patrz http://zend-framework-community.634137.n4.nabble.com/How-to-handle-404-with-action-controller-td4659101.html ostatecznie)

pokrewne: Zend Framework - Returning Image/File using Controller

+0

Czy nie byłoby lepiej wstrzyknąć usługę obrazu (łatwiejsze wstrzykiwanie fałszywek do testowania itp.) Do kontrolera zamiast korzystania z lokalizatora usług w środku? –

+0

Rzeczywiście. Z pewnością była to szybka i brudna wersja. Jestem silnym zwolennikiem silnego IOC (zobacz http://ocramius.github.com/blog/zf2-and-symfony-service-proxies-with-doctrine-proxies/) – Ocramius

+0

@Ocramius Bardzo przydatna odpowiedź. Dzięki, sprawdzi to wdrożenie. – Prashant

2

Skorzystaj z tej usługi i wprowadź ją do sterowników wymagających tej funkcji.

0

Aby zmienić rozmiar przesłanego obrazu w locie powinien to zrobić:

public function imageAction() 
{ 
// ... 
$imagine = $this->getImagineService(); 
$size = new \Imagine\Image\Box(150, 150); 
$mode = \Imagine\Image\ImageInterface::THUMBNAIL_INSET; 

$image = $imagine->open($destinationPath); 
$image->thumbnail($size, $mode)->save($destinationPath); 
// ... 
} 

public function getImagineService() 
{ 
    if ($this->imagineService === null) 
    { 
     $this->imagineService = $this->getServiceLocator()->get('my_image_service'); 
    } 
    return $this->imagineService; 
} 
2

Tutaj jest moduł o nazwie WebinoImageThumb w Zend Framework 2. Checkout tym. Ma jakąś wielką funkcji takich jak -

  • zmiany rozmiaru obrazu
  • przycinania obrazu, pad, obracanie, pokaz i zapisywać obrazy
  • Tworzenie obrazu odbicie
2

Dla tych, którzy nie są w stanie zintegrować Imagine właściwie jak ja ..

Znalazłem inne rozwiązanie WebinoImageThumb here, które działało idealnie dobrze ze mną.Oto małe wyjaśnienie, jeśli nie chcesz przeczytać pełną dokumentację:

Run: php composer.phar require webino/webino-image-thumb:dev-develop i dodać WebinoImageThumb jako aktywny moduł w config/application.config.php co dodatkowo wygląda następująco:

<?php 
return array(
    // This should be an array of module namespaces used in the application. 
    'modules' => array(
     'Application', 
     'WebinoImageThumb' 
    ), 

.. poniżej pozostaje ten sam

teraz w użytku działania regulatora to poprzez służbę lokalizator jak poniżej:

// at top on your controller 
use Zend\Validator\File\Size; 
use Zend\Validator\File\ImageSize; 
use Zend\Validator\File\IsImage; 
use Zend\Http\Request 

    // in action 
$file = $request->getFiles(); 
$fileAdapter = new \Zend\File\Transfer\Adapter\Http(); 
$imageValidator = new IsImage(); 
if ($imageValidator->isValid($file['file_url']['tmp_name'])) { 
    $fileParts = explode('.', $file['file_url']['name']); 
    $filter = new \Zend\Filter\File\Rename(array(
       "target" => "file/path/to/image." . $fileParts[1], 
       "randomize" => true, 
      )); 

    try { 
     $filePath = $filter->filter($file['file_url'])['tmp_name']; 
     $thumbnailer = $this->getServiceLocator() 
         ->get('WebinoImageThumb'); 
     $thumb = $thumbnailer->create($filePath, $options = [], $plugins = []); 
     $thumb->adaptiveResize(540, 340)->save($filePath); 

     } catch (\Exception $e) { 
      return new ViewModel(array('form' => $form, 
        'file_errors' => array($e->getMessage()))); 
     } 
    } else { 
     return new ViewModel(array('form' => $form, 
       'file_errors' => $imageValidator->getMessages())); 
    } 

Powodzenia ... !!