Отображение PNG из базы данных с использованием WideImage
Используя расширение WideImage, я пытаюсь визуализировать блоб изображения из базы данных, используя эту функцию:
protected function renderControlNonEditable()
{
assert('$this->model instanceof Item || $this->model->getModel() instanceof Item');
$content = null;
if ($this->model->files->count() > 0)
{
$content .= '<ul class="attachments">';
foreach ($this->model->files as $fileModel)
{
$filecontent = FileContent::getById($fileModel->id);
$filecontent = $filecontent->content;
$content .= '<li><span class="icon-attachment"></span>';
$content .= FileModelDisplayUtil::renderDownloadLinkContentByRelationModelAndFileModel($this->model,
$fileModel);
$content .= ' ' . FileModelDisplayUtil::convertSizeToHumanReadableAndGet((int)$fileModel->size);
$content .= '</li>';
$content .= WideImage::load($filecontent);
}
$content .= '</ul>';
}
return $content;
}
Но когда $content
рендеринг показывает следующую строку BLOB вместо рендеринга изображения.
�PNG IHDRd$��8:IDATh�ݛy|Օ����
Как я могу гарантировать, что правильные заголовки выпускаются? Что я могу сделать, чтобы это исправить?
public function actionImage($model, $fileModel)
{
$filecontent = FileContent::getById($fileModel->id);
$filecontent = $filecontent->content;
$content = WideImage::load($filecontent);
return $content;
}
1 ответ
Ну, как уже упоминали другие люди, вы не можете сбросить вывод широкоформатного изображения (или любого изображения) на html-страницу. Ваше лучшее решение (и я думаю, только слишком) - это создать еще одну функцию, которая обрабатывает только изображение.
Вы должны создать HTML так же, как вы делаете сейчас, а не
$content .= FileModelDisplayUtil::renderDownloadLinkContentByRelationModelAndFileModel($this->model, $fileModel);
что я считаю, получить содержание изображения, есть
$content .= '<img src="'.$this->createUrl('image',array('file'=>$fileModel)).'">'
Ваша функция (actionImage) должна быть в том же контроллере (в моем примере в любом случае) должна получить BLOB-объект, делать все, что вы хотите сделать, а затем выводить изображение (и только изображение, без HTML).