Kohana 3, обслуживать изображения, хранящиеся в базе данных - PullRequest
0 голосов
/ 01 апреля 2011

У меня это работало над коханой 2, но в кохане 3 это не так.

Чтобы подать изображение, хранящееся в BLOB в базе данных, я сделал следующее:

1Контроллер, к которому я запрашиваю, какое изображение мне нужно.Я подключаюсь к базе данных, используя модель, конечно, и обслуживаю изображение, используя представление.

$prod = ORM::factory('product',$idx);
$img = new View('image');
$img->pic = $prod->getImage();

2 - У модели есть небольшая хитрость, чтобы заставить это работать:

public function getImage() 
  {
    return imagecreatefromstring($this->image);
  }

image - это столбец BLOB-объектов, в котором я сохраняю картинку, которую хочу предоставить.

3- В представлении: я устанавливаю заголовок типа содержимого и затем отображаю изображение

header('content-type: image/png; charset=UTF-8');
imagepng($pic); 

работал в Kohana 2, но в KO3 это не так,

Я пытаюсь использовать $ response-> send_file (), но я заблудился

1 Ответ

0 голосов
/ 02 апреля 2011

Во-первых, вы никогда не должны отправлять заголовки с header (), если только вы не взломали fw. Ko3.1 прекрасно отделяет Request от Response, и последний отвечает за заголовки ответов / все остальное (оба написаны в значительной степени в соответствии с RFC 2616 ).

Во-вторых, в этом случае абсолютно нет необходимости в файле представления, Response :: $ _ body - это то, что возвращает текущий объект ответа.

Response :: send_file () возвращает ответ в виде загрузки, я полагаю, это не то, что вы пытаетесь выполнить?

Итак, вам нужно что-то вроде этого (измените ваши собственные потребности):

public function action_image($id)
{
    $image = ORM::factory('product', $id);

    if ( ! $image->loaded()) // ... 404 ?

    $this->response
        ->headers('Content-Type','image/png')
        ->body($image->image)
        ->check_cache(NULL, $this->request); // 304 ?
}
...