MySQL капля изображение не отображается - PullRequest
1 голос
/ 06 мая 2011

У меня проблема с отображением изображений после их извлечения из базы данных. У меня есть две отдельные таблицы, одна для метаданных, а другая для хранения фактических данных 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.

любая помощь будет оценена, я действительно не знаю, что с этим не так.


отредактировал некоторое форматирование для отображения.

Ответы [ 2 ]

1 голос
/ 05 августа 2012

Недавно я сделал что-то подобное, но использовал другой подход для рендеринга. Zend не запустит приложение, если URI запроса к реальному файлу, поэтому я создал действие рендеринга в моем файловом контроллере, который создал копию образа на диске. Это значительно упрощает масштабирование и управление, поскольку все файлы находятся в одной центральной базе данных, но также дает преимущества в производительности чтения с диска. Вот мое открытое действие:

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');
}
0 голосов
/ 06 мая 2011

нет никакой реальной необходимости загромождать базу данных данными изображений. (Извлечение данных из базы данных также будет значительно медленнее, чем просто загрузка их с диска)

Я предлагаю вам просто сохранить изображения в файловой системе и сохранить путь к изображению в базе данных вместе с метаданными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...