0

どうすればいいのですか?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();
}

ここで最初の回答に従って編集した後、次のエラー メッセージが表示されます。 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() を削除すると、コードは「機能」します。正しい名前とほぼ正しいサイズのファイルを取得します。

4

1 に答える 1

0

私の意見では、ビューは決してヘッダーを出力すべきではありません。また、コントローラーでは、ヘッダーを設定するためのメソッドを持つ応答オブジェクトにアクセスできます。

また、$dokument->Dokumentbase64でエンコードされていますか?それ以外の場合は、そのヘッダーをスキップしてください。

私はおそらく次のようなことをします:

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-01-05T15:11:49.237 に答える