CakePHPでファイルダウンロード機能を作る

CakePHPでファイルのダウンロード機能の実装例を見てみたいと思います。
今回はビューからコントローラーにファイル名を送り、そこからダウンロードする方法をやってみます。
Cakeのバージョンは2.xです。

まずは、Viewからコントローラーにデータを送りたいと思います。
以下Viewのコードです。

<?php echo $this->Html->link('ダウンロード', array('controller' => 'コントローラー名',
 'action' => 'アクション名', ファイル名)); ?>

今度はリンクヘルパーで指定したコントローラーのアクション部分のコードを見てみたいと思います。

public function アクション名($file_name = null) {
  $this->autoRender = false; // オートレンダーをOFFに
  $this->response->file('download/' . $file_name);//app/webroot からの相対パスorフルパスを指定
  $this->response->download($file_name);  //ダウンロード
}

$file_nameにはファイル名が入ります。
最後のdownload()には引数にファイル名を入れておかないとエラーになります。
この場合、app/webroot/download/内にある$file_nameで指定したファイルをダウンロードをすることが出来ます。これでダウンロードしたいファイルを場合分けすることも可能になります。

ちなみに、ファイルのダウンロードの方法としてはmediaviewもありますが、こちらだと、Viewのような書き方で引数を送ろうとするとページ遷移が起こってしまうため出来ませんでした。引数を送らずに特定のファイルだけをダウンロードする場合にはうまくいきました。
しかし、コード量も短くなるし直感的になるためCakeResponseを使ったほうが良いでしょう。

お見積もりフォーム