CakePHPはHTMLページの出力をすることを前提に作られていますが、それ以外にもユーザーにPDFファイルやCSVファイルをダウンロードさせるような場合もあると思います。
今回は仕事でPDFファイルを出力する処理を作りましたので、備忘録として残しておきます。
こんなことを前提として考えています。
- ユーザーがリンクをクリックするとこのメソッドが呼び出される
- ダウンロードさせるファイルの置き場所は定義ファイルに記述する
/uploads/download/ファイル名 にアクセスするとPDFファイルをダウンロードできるようにします。
以下、コントローラファイルの抜粋です。
class UploadsController extends AppController { var $name = 'Uploads'; var $uses = array('Upload'); /* 他のメンバー変数 */ /** * ファイルをダウンロードさせるメソッド */ public function download($filename=null){ if( $filename ){ $this->autoRender = false; // Viewを使わないように Configure::write('debug', 0); // debugコードを出さないように $path_name = Configure::read('upload.path').DS.$filename; if( is_file($path_name) ){ $fp = fopen($path_name, 'rb'); $pdf = fread($fp, filesize($path_name)); // ダウンロードさせるファイルに応じたヘッダ情報を出力 header ("Content-type: application/pdf;"); // この例はPDFファイル header("Content-disposition: inline; filename=" . $filename); } else { // 指定されたファイルがない場合のエラー処理 } print($pdf); // 出力 return; } $this->redirect(array("controller"=>"articles","action"=>"index")); } /* 他のメソッド */ }
ポイントとなるのは、ダウンロードさせるファイル形式に対応したヘッダー情報を手動で出力すること、そしてそのヘッダー情報の前に何も出力しないことです。改行コードやスペースが1文字入っているだけでも正常な結果が得られないので注意!