CakePHPでHTMLページ以外(PDFファイル等)を出力する

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

This entry was posted in Webプログラミング and tagged . Bookmark the permalink.

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>