возвращает динамическое изображение zf2

#image #zend-framework2 #http-headers #gd2

#изображение #zend-framework2 #http-заголовки #gd2

Вопрос:

Я использую zend framework 2 и пытаюсь вернуть созданное с помощью библиотеки gd2 изображение в формате jpeg. но это не работает. не могли бы вы посмотреть мой код, в чем проблема? Мой код выполняется с обычным php в обычном режиме, но в zf2 проблема?

 class PictureController extends AbstractActionController
{
    public function colorPaletteAction(){

        ....
        ....
        //canvas created at above.

        imagejpeg($canvas);
        imagedestroy($canvas);
        $response = $this->getResponse();

        return $response->getHeaders()->addHeaderLine('Content-Type', 'image/jpeg');
    }
}
  

Комментарии:

1. Вы отключаете макет и представление в … коде, который вы не показывали?

2. да, я пробовал это, но это не работает: (

3. $response = $this->GetResponse(); $response->getHeaders() ->addHeaderLine(‘Content-Type’, ‘image/jpeg’); $ViewModel = new ViewModel(); $ViewModel->setTerminal(true); возвращает $ViewModel;

Ответ №1:

imagejpeg немедленно выводит данные, чего вы не хотите делать. Вы можете либо использовать выходной буфер для захвата этих данных, либо сначала записать их в файл. Выходной буфер, вероятно, самый простой:

 public function colorPaletteAction()
{
    // [create $canvas]

    ob_start();
    imagejpeg($canvas);
    $imageData = ob_get_contents();
    ob_end_clean();

    imagedestroy($canvas);

    $response = $this->getResponse();

    $response->getHeaders()->addHeaderLine('Content-Type', 'image/jpeg');
    $response->setContent($imageData);

    return $response;
}
  

Если это не сработает, временно закомментируйте строку заголовка типа содержимого, чтобы увидеть, какой результат вы получаете. Убедитесь, что в выходных данных нет ошибок или HTML.

Комментарии:

1. это не работает .. я сделаю это с помощью обычного php, а не в zf2

Ответ №2:

Вы устанавливаете заголовок типа содержимого в «изображение / png» вместо «изображение / jpeg».

Также попробуйте добавить заголовки content-transfer-encoding и content-length:

 $response->getHeaders()->addHeaderLine('Content-Transfer-Encoding', 'binary')
                       ->addHeaderLine('Content-Length', mb_strlen($yourJpegContent));
  

Я также не вижу, чтобы вы добавляли фактическое содержимое в ответ:

 $response->setContent($yourJpegContent);
  

где $yourJpegContent содержит двоичные данные изображения.