mysql blob图像无法显示

时间:2011-05-05 22:37:02

标签: php mysql blob

从数据库中提取图像后,我无法显示图像。 我有2个单独的表,一个用于元数据,另一个用于保存实际的blob数据。该表是一个常规BLOB,我每行只存储60k块数据。当我想渲染它时,我重新编译图像。

我不断收到此错误:

图片“http://imgStore.localhost/ImageBuilder/index/id/11”无法显示,因为它包含错误。

这是流程的工作原理。

/ Images / image / id / 11将在其中包含一个像这样的图像

<img src="http://imgStore.localhost/ImageBuilder/index/id/11" />

图像控制器处理插入和编辑以及列出图像 而ImageBuilder只关注显示给定的图像

这是表结构:

images ------
image_id    INT
image_name  VARCHAR
image_type  VARCHAR
image_size  INT
loaded_date DATETIME

image_data --
image_data_id  INT
image_id       INT
data           BLOB

这是我如何将文件保存到数据库中:

(注意:我使用的是最新的Zend Framework)

(插入动作)------------------

$image  = new ImgStore_Model_Images($form->getValues());
$image->setImage_size(((int) substr($form->image_file->getFileSize(), 0, -2) * 1024));
$image->setImage_type($form->image_file->getMimeType());
$image->setLoaded_date(time());
$image->setLoaded_by($user->get('contacts_id'));
$mapper = new ImgStore_Model_ImagesMapper();
$image_id = $mapper->save($image);

// open the uploaded file to read binary data
$fp = fopen($form->image_file->getFileName(), "r");
$dataMapper = new ImgStore_Model_ImageDataMapper();
// loop through the file and push the contents into
// image data entries

while( !feof($fp) ){
 // Make the data mysql insert safe
 $binary_data = addslashes(fread($fp, 60000));

 $data_entry = new ImgStore_Model_ImageData();
 $data_entry->setImage_id($image_id);
 $data_entry->setImage_data($binary_data);

     $dataMapper->save($data_entry);
}
fclose($fp);

以下是它的提取方式:

(行动)------------------

$this->_helper->_layout->disableLayout();

// get the image meta data
$image_id   = $this->_request->getParam('id', '0');

$mapper = new ImgStore_Model_ImagesMapper();
$info   = $mapper->getInfo($image_id);

// build the image and push it to the view
$mapper            = new ImgStore_Model_ImageDataMapper();
$this->view->image = $mapper->buildImage($image_id);
$this->view->name  = $info->getImage_name();
$this->view->type  = $info->getImage_type();
$this->view->size  = $info->getImage_size();

(型号)------------------

public function buildImage($image_id)
{
     // get the image data
     $sql = "SELECT image_data
             FROM image_data
             WHERE image_id='$image_id'
             ORDER BY image_data_id ASC";
     $results = $this->_adapter->fetchAll($sql);

     // piece together the image and return it
     $image = NULL;
     foreach( $results as $row ){
          $image .= $row['image_data'];
     }
     return $image;
} #end buildImage function

(查看)------------------

<?php

header( "Content-Type: " . $this->type );
header('Content-Disposition: inline; filename="'.$this->name.'"');

echo $this->image;

?>

我试图使用一个小到足以在image_data表中只占用一行的图像,所以我不相信它与重新编译image_data行有任何关系。

任何帮助都会受到赞赏,我真的不知道这有什么问题。


为了显示目的编辑了一些格式。

2 个答案:

答案 0 :(得分:1)

我最近做过类似的事情但是使用了不同的渲染方法。如果对实际文件的请求URI,Zend将不会启动应用程序,因此我在文件控制器中创建了一个渲染操作,该驱动器在驱动器上创建了映像的副本。这使得扩展和管理变得更加容易,因为文件都在一个中央数据库中,但也提供了从磁盘读取的性能优势。这是我的公开行动:

public function openAction() {
    $file = // find the file in the db
    if(! $file) {
        throw new Zend_Exception('File not found', 404);
    }

    $path = // get the filepath
    if(! file_exists($path) || $this->_request->getParam('reload') == true) {
        file_put_contents($path, $file->image_data);
    }

    $this->_redirect('document root relative path');
}

答案 1 :(得分:0)

使用图像数据混淆数据库没有实际价值。 (从数据库中获取数据也将比仅从磁盘上加载数据慢得多)

我建议您只将图像存储在文件系统上,并将元数据的路径存储在数据库中。