【问题标题】:Kohana 3, serve image stored in a databaseKohana 3,提供存储在数据库中的图像
【发布时间】:2011-03-31 23:10:02
【问题描述】:

我在 kohana 2 上进行了这项工作,但在 kohana 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(),但我迷路了

【问题讨论】:

  • 请显示您的控制器代码(带有$response->send_file() 等)

标签: kohana kohana-3


【解决方案1】:

首先,除非您正在破解 fw,否则您永远不应该使用 header() 发送标头。 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 ?
}

【讨论】:

  • 顺便说一句。我建议您为此使用本机数据库函数,并将 etag 保存在 db 中,减少以后的开销(稍后将其作为检查缓存的第一个参数传递)
  • 一切顺利!谢谢!我不得不按原样从数据库中返回数据,imagecreatefromstring 破坏了图像......不太确定为什么(我的意思是,它在 KO2 中有效)。我很着急,所以,再次感谢您!
猜你喜欢
  • 2011-04-02
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 2013-08-06
  • 1970-01-01
  • 2011-04-24
相关资源
最近更新 更多