mysql blob 图像不显示

发布于 2024-11-05 12:22:51 字数 3184 浏览 0 评论 0原文

从数据库中提取图像后,我在显示图像时遇到问题。 我有 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 表也是如此,所以我不认为它与重新编译有任何关系图像数据行。

任何帮助将不胜感激,我真的不知道这有什么问题。


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

I'm having a problem getting my images to display after extracting them from a database.
I have 2 separate tables, one for the meta data and another to hold the actual blob data. that table is a regular BLOB and i only store 60k chunks of data in each row. I recompile the image when i want to render it.

i keep getting this error though:

the image "http://imgStore.localhost/ImageBuilder/index/id/11" cannot be displayed because it contains errors.

here is how the flow works however.

/Images/image/id/11 will have an image inside of it like this

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

the Images controller handles insertions and edits as well as listing the images
while ImageBuilder is only concerned with displaying a given image

here is the table structure:

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

here is how i save the file into the database:

( NOTE: i'm using the latest Zend Framework )

( insertion action ) ------------------

$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);

and here is how it is extracted:

(action) ------------------

$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();

(model) ------------------

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

(view) ------------------

<?php

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

echo $this->image;

?>

i have tried to use an image that was small enough to take up only one row in the image_data table as well, so i don't believe it has anything to do with the recompilation of the image_data rows.

any help would be appreciated, i truly have no idea what is wrong with this.


edited some formatting for display purposes.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

时常饿 2024-11-12 12:22:51

我最近做了类似的事情,但使用了不同的渲染方法。如果请求 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');
}

I recently did something like this but used a different approach for the rendering. Zend won't fire up the app if the request URI to an actual file, so I created a render action in my file controller that created a copy of the image on the drive. This makes scaling and management much easier since the files are all in one central db, but also gives the performance benefits of reading from the disk. Here's my open action:

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');
}
末骤雨初歇 2024-11-12 12:22:51

用图像数据扰乱数据库没有任何实际价值。 (从数据库获取数据也会比简单地从磁盘加载数据慢得多)

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

there's no real value in cluttering up the database with image data. (Fetching the data from the database will also be significantly slower than simply loading it off disk)

I suggest that you just store the images on the file system, and store the path to the image in the database alongside the meta data.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文