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文字入っているだけでも正常な結果が得られないので注意!