【问题标题】:Downloading a blob (type: image) from a mssql db in zend framework从 zend 框架中的 mssql db 下载 blob(类型:图像)
【发布时间】:2011-01-05 14:57:52
【问题描述】:

我该怎么做?我尝试使用 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 Fatal error: Call to a member function setHttpResponseCode() on a non-object in ...\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(),代码“有效”。我得到了一个名称正确且大小大致正确的文件。

【问题讨论】:

  • 为什么要发送 base64 编码的数据?真的是base64编码的吗?
  • 不是,只是我尝试的最后一件事。我得到一个大小与应有大小相同的损坏文件。

标签: php sql-server zend-framework zend-server


【解决方案1】:

在我看来,视图永远不应该输出标题。对我来说,它更像是一个控制器要做的事情。此外,在控制器中,您可以访问响应对象,该对象具有设置标头的方法。

另外,$dokument-&gt;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);
}

【讨论】:

  • 感谢您的快速回复!虽然它只给了我一个内部服务器错误:(这是我的代码,其中的字段已更新以与我正在使用的数据库相对应(该死的他们不仅仅是将文件保存在文件服务器上......):
  • [2011 年 1 月 5 日 22:22:18] PHP 致命错误:在 ...\application\views\scripts\error\ 中的非对象上调用成员函数 _()第 1 行的 error.phtml
  • [05-Jan-2011 22:42:59] PHP 致命错误:在 ...\application\modules\ordre\controllers\ 中的非对象上调用成员函数 setHttpResponseCode()第 45 行的 OrdreController.php 第 45 行是:->setHttpResponseCode(200)
  • 如果我删除第 44 行:->clearBody(),图像已下载,但无法读取。
  • 刚发现blob被压缩了,想知道怎么解压。
猜你喜欢
  • 2011-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-06
  • 2012-05-06
  • 1970-01-01
  • 2011-03-15
  • 1970-01-01
相关资源
最近更新 更多