CodeIgniter + Uploadify

ちょっとハマったのでメモ的に。

CodeIgniterのフォーラムでも同様の事が書かれているのだが、ちょっと古い。それに、CodeIgniterっぽくコントローラに書かれていないのでちょっと不満だった。余計なパスも入ってるし。


ビューは普通に。

<input id="file_upload_img" name="file_upload_img" type="file" />

JavaScriptも大差は無いが、'script'をhttp://から書かないとバーチャルホストの場合に躓いた。

	$('#file_upload_img').uploadify({
		'uploader'  : '/img/uploadify.swf',
		'script'    : 'http://example/uploadify/upload',
		'cancelImg' : '/img/cancel.png',
		'folder'    : '/uploads',
		'onComplete' : function(event, ID, fileObj, response, data) {
			...
		},
		'auto'      : true
	});

コントローラは/application/controllers/uploadify.phpとしてクラスとして配置。

<?php
class Uploadify extends MY_Controller {

	public function index()
	{
		//do nothing
		redirect('/', 'refresh');
	}
	public function upload() {
		//uploadify.phpの中身
	}
}

とまぁ、ここまでは良かった。

んで、ハマったのが、Apacheのログからリクエストはされている事が確認できたのだが、Uploadify::upload()に行ってくれない事。何だろう〜としばし悩んだ結果、システムでは良くあるセッションチェックで弾かれていたのでした。

セッションチェックは/application/core/MY_Controller.phpで行っていて、

<?php
class MY_Controller extends CI_Controller {
	public function __construct() {
		parent::__construct();
	}

	public function _remap($method, $params = array()) {
		$CI =& get_instance();
		$CI->load->library('session');
		$CI->load->helper('url');

		if (!isset($this->session->userdata['id'])) {
			redirect('login', 'refresh');
			exit;
		}
		return call_user_func_array(array($this, $method), $params);
	}
}

みたいにしてた。ここで$this->session->userdata['id']が無いためログインフォームにリダイレクトしていたのでした。
という事で、その前に

		//Uploadify
		if (get_class($this->session->CI) == 'Uploadify') {
			return call_user_func_array(array($this, $method), $params);
		}

って感じで、オブジェクトがUploadifyの場合は許可したのでした。
勿論、もう少し厳密に$methodなんかを使っても良いと思うけど、取り敢えずはこれで解決できました、と。

[追記]
.htaccess

RewriteEngine on
RewriteCond $1 !^(index\.php|img|css|js|uploads|robots\.txt)
RewriteRule ^(.*)$ /index.php/$1 [L]

とuploadsディレクトリを直接参照できるようにしとかないと、表示とかできませんので注意。