2011-01-05 2 views
0

Как это сделать? Я попытался использовать file_put_contents(), но создал поврежденный файл.Загрузка blob (тип: изображение) из mssql db в zend framework

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

<?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() на не-объект в ... \ приложения \ модули \ \ Ordre контроллеры \ 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(), код "работает". Я получаю файл с правильным именем и примерно правильным размером.

+0

Что идет не так? –

+1

Почему вы отправляете закодированные данные base64? Это действительно закодировано base64? –

+0

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

ответ

0

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

Также есть $dokument->Dokument base64-encoded? В противном случае просто пропустите этот заголовок.

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

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); 
} 
+0

Спасибо за быстрый ответ! Это только дало мне внутреннюю ошибку сервера :( Это мой код с полями, обновленными для соответствия с БД, с которой я работаю (черт бы их не только для сохранения файлов на файловом сервере ...): –

+0

http://pastebin.com/7SJBXn6p –

+0

Не могли бы вы также вставить сообщения журнала ошибок? – PatrikAkerstrand