1

私はcakephpアプリケーションを持っています。私のアプリはそのレイアウトにdefault.ctpを使用していることを理解しています。デフォルトのレイアウトでは、ヘッダーはhtml/textに設定されています。ヘッダータイプをimage/pngに変更したいのですが、どこで変更すればよいですか?誰かが私を助けてくれます

コード:

$this->layout=NULL; 
$this->autoRender=false; 
$this->RequestHandler->respondAs('image/jpg');

      View Coding :(index.ctp)
           <?php 
           session_start(); 
           $text = rand(10000,99999); 
           $_SESSION["vercode"] = $text; 
           $height = 25; 
           $width = 65; 

           $image_p = imagecreate($width, $height); 
           $black = imagecolorallocate($image_p, 0, 0, 0); 
            $white = imagecolorallocate($image_p, 255, 255, 255); 
            $font_size = 14; 
            imagestring($image_p, $font_size, 5, 5, $text, $white); 
            imagejpeg($image_p, null, 80); 
                  ?>
           Controller coding :

                public function index() 
                {
                      $this->layout=false;
                      $this->response->type('png');
                } 

注:CakePHPバージョン2.3.0

4

3 に答える 3

2

CakePHP3の使用

PHPのheader()関数を使用してヘッダーを手動で設定するのではなく、常にCakePHPの方法で実行するようにしてください。この場合、ドキュメントはあまり明確ではありませんでした。私はそれを理解しなければなりませんでした。

これが私がCakePHP3.3を使ってそれを機能させた方法です:

  • まず、画像のコンテンツを変数に取り込みます。これは、CakePHPに、出力して終了するだけでなく、そのコンテンツをレンダリングさせたいためです。

  • 次に、画像リソースを破棄してメモリを解放します。

  • オプション:キャッシュヘッダーを設定できます。(以下のコードでコメントされています)

  • 応答オブジェクトタイプを「jpg」や「png」などに設定します。ドキュメントを参照してください

  • レイアウトを「false」に設定します

  • 画像を応答本文に出力し、autoRenderをfalseに設定して、不要なテンプレートファイル(.ctp)が作成されないようにします。

// Controller method
public function image($id = null) {
    // Create an image resource: $image ...
    ob_start();
    imagejpeg($image);
    $buffer = ob_get_clean();
    imagedestroy($image);

    // $this->response->cache('-1 minute', '+1 days');
    $this->response->type('jpg');
    $this->viewBuilder()->layout(false);
    $this->response->body($buffer);
    $this->autoRender = false;
}
于 2016-11-29T05:40:24.867 に答える
1

ビュー/レイアウトのコンテンツを画像として返す必要がある場合(これは非常に疑わしいです):

$this->response->type('png'); // as documented in the 2.x docs

image/pngヘッダーの応答タイプとして自動的に設定されます。

レイアウトなしでビューをレンダリングする必要がある場合は、

$this->layout = false;
// OR
$this->render('my_view', false); // false should not render a layout

デフォルトのレイアウトをレンダリングするため、「null」は使用できません。

いずれにせよ、常に応答オブジェクトを介してコントローラーで、ビュー内のheader()のものを呼び出さないでください。

于 2013-02-25T10:06:13.867 に答える
-1

(ええ、古いスレッドですが、私はちょうどこの問題に遭遇しました。)

$this->autoRender = false;
header('Content-Type: image/png');

コントローラーの方法で私のために働いた。

于 2016-07-29T18:25:34.650 に答える