#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 содержит двоичные данные изображения.