Загрузка BLOB-объекта (тип: изображение) из базы данных mssql в Zend Framework - PullRequest
0 голосов
/ 05 января 2011

Как мне это сделать? Я пытался использовать file_put_contents (), но он создал поврежденный файл.

Я сейчас пытаюсь настроить представление с правильными заголовками, чтобы это работало.

<?php   
    header('Content-Type: image/jpeg');
    header('Content-Transfer-Encoding: base64');
    echo $this->dokument->Dokument;

это содержимое моего контроллера:

public function imageAction()
{   
    $id = $this->_getParam('id'); 

    $dokumentTabell = new Ordre_Model_Table_OrdreDokument();
    $dokument = $dokumentTabell->find($id)->current();
    $this->view->dokument = $dokument;

    // disable layout and view
    $this->view->layout()->disableLayout();
}

После редактирования в соответствии с первым ответом здесь выдается следующее сообщение об ошибке: Неустранимая ошибка PHP: вызов функции-члена setHttpResponseCode () для необъекта в ... \ application \ modules \ ordre \ controllers \ OrdreController .php на линии 45

строка 45 это так:

     ->setHttpResponseCode(200)

Остальной код:

public function imageAction()
{   
$id = $this->_getParam('id'); 

$dokumentTabell = new Ordre_Model_Table_OrdreDokument();
$dokument = $dokumentTabell->find($id)->current();
$this->view->dokument = $dokument;
$filename = $dokument->Name.".".$dokument->FileExtension;
// disable layout and view
$this->view->layout()->disableLayout();
$this->_helper->viewRenderer->setNoRender(true);

$this->getResponse()
     ->clearAllHeaders()
     ->clearBody()
     ->setHttpResponseCode(200)
     ->setHeader('Content-Type', 'image/jpeg')
     ->setHeader('Content-Length', strlen($dokument->Dokument))
     ->setHeader(
        'Content-Disposition',
        "attachment;filename=\"{$filename}\""
     )
     ->setHeader('Last-Modified', $dokument->SistEndret)
     ->setBody($dokument->Dokument);
}

Если я удалю строку 44: -> clearBody (), код «работает». Я получаю файл с правильным именем и приблизительно подходящим размером.

1 Ответ

0 голосов
/ 05 января 2011

По моему мнению, представления никогда не должны выводить заголовки. Для меня это больше похоже на работу контроллера. Также в контроллере у вас есть доступ к объекту ответа, у которого есть методы для установки заголовков.

Кроме того, $dokument->Dokument base64-закодировано? В противном случае просто пропустите этот заголовок.

Я бы, наверное, сделал что-то вроде:

public function imageAction()
{   
    $id = $this->_getParam('id'); 

    $dokumentTabell = new Ordre_Model_Table_OrdreDokument();
    $dokument = $dokumentTabell->find($id)->current();
    $this->view->dokument = $dokument;

    // disable layout and view
    $this->_helper->Layout()->disableLayout();
    $this->_helper->ViewRenderer->setNeverRender();

    $this->getResponse()
         ->clearAllHeaders()
         ->clearBody()
         ->setHttpResponseCode(200)
         ->setHeader('Content-Type', 'image/jpeg')
         ->setHeader('Content-Length', strlen($dokument->Dokument))
         ->setHeader(
            'Content-Disposition',
            "attachment;filename=\"{$dokument->filename}\""
         )
         ->setHeader('Last-Modified', $dokument->lastModified)
         ->setBody($dokument->Dokument);
}
...