gpt4 book ai didi

php - mysql blob图像不显示

转载 作者:行者123 更新时间:2023-11-29 00:56:26 25 4
gpt4 key购买 nike

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

虽然我一直收到这个错误:

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

不过,流程是这样运作的。

/Images/image/id/11 里面会有一张像这样的图片

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

图像 Controller 处理插入和编辑以及列出图像而 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 框架)

(插入 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);

下面是它的提取方式:

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

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

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;

?>

我曾尝试使用小到只占 image_data 表中一行的图像,所以我认为它与 image_data 行的重新编译没有任何关系。

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


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

最佳答案

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

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');
}

关于php - mysql blob图像不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5904893/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com