У меня проблема с отображением изображений после их извлечения из базы данных.
У меня есть две отдельные таблицы, одна для метаданных, а другая для хранения фактических данных BLOB-объектов. эта таблица является обычным BLOB, и я храню только 60 тыс. порций данных в каждой строке. Я перекомпилирую изображение, когда я хочу отрендерить его.
я продолжаю получать эту ошибку, хотя:
изображение "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.
любая помощь будет оценена, я действительно не знаю, что с этим не так.
отредактировал некоторое форматирование для отображения.