Author Archives: ogihara

CodeIgniterで開発してみました(Uploadifyとの組み合わせ例)

久しぶりに新規開発案件があったので、せっかくなので新しいフレームワークを試して見ようと思い、前々から気になっていたCodeIgniterで開発してみました。
とは言え内製以外のPHPフレームワークでまともに開発に使用したのはEthnaくらいなので他との比較は出来ませんが、それでもこれは軽量の開発では特に使いやすい。特に海外で人気が高かったのも良くわかるフレームワークでした。

で、基本的な構造を把握すればあとは内製モジュールを適宜利用して大抵のことはちゃちゃっと出来たのですが、追加用件で複数ファイルのアップロードをしたいと要望が上がってきました。
ただ、CIのファイルアップロードクラスを見てもどうもそのままでは実現できそうにありません。

そこで外部プログラムと連携して実装することにしました。
さて、今回は
複数ファイルの一括アップロードに

  • Uploadify
    v3.2.1
  • jquery
    v1.11.0

を使用しました(開発時の最新バージョン)
Uploadifyとjqueryのファイルは解凍し、適当な場所に保存しておきます。

プログラム自体は複数の(.rar/.zip)ファイルを一括でアップロードしサーバ側で展開しつつ加工する、と言うものです。

  • 送信側テンプレート

  •  受け側関数(controllers/hoge.php)

この$upload_dataにはファイルアップロードクラスのお陰でファイルをいじるのに必要な情報がばっちり詰まっています。

http://codeigniter.jp/user_guide_ja/libraries/file_uploading.html
ですのであとはファイルを好きなように加工すればプログラムは完成です。

が、ここで問題が二点発生。

問題点1

CSRF防止設定との共存が出来ない。

CodeIgniterのconfig設定で

とするとアップロードに失敗してしまいます。

これを有効にすると常にPOSTの際にCookieとhiddenパラメータとを比較してCross Site Request Forgeryのチェックが行われるのですが、この場合、uploadify.swfがPOSTするためにCookieの値が無い状態となりチェックではじかれてしまうのです(flash版では無くHTML5バージョンだとどうなるかは不明)

試しに

と、CSRFトークンを明示的にPOSTするようにしても駄目でした。
コントローラ毎に

を切り替えられれば良いのですが、CI_Configクラスを拡張するなどが必要そうです。

と言う事で仕方なく

で運用し、適宜プログラム側でチェックすることで回避することにしました。

問題点2

アップロードエラーが発生しても通知できない。

通常のアップロード後にプログラムで処理しようとしてエラーが発生した際に、アップロード画面にエラーを通知出来ません。
uploadifyに付属するサンプルプログラムでは受け側で

とエラーメッセージを吐いている風ですが、実際にはifの結果がどちらでも処理はOKとなります。

解決策
POSTした祭のステータスでのエラーはハンドリングされているようなので
例によって受け側関数(controllers/hoge.php)にて

とすればUploadifyのflashのアップロード進捗画面にErrorが表示されます。

また、CodeIgniterの機能を利用してもっと簡単にここで

を実行すればデフォルトのstatus codeとして500が帰りますのでこちらを使いましょう。

と言うわけで

外部プログラムとの組み合わせのために若干の右往左往はあったものの、再度言いますがこれは学習コストも少なく人気のあるフレームワークなのも良くわかると言うものでした。

また簡単な開発案件があったら第一候補として使えそうです。

(が、どうもライセンス周りで色々と大変な様ですね……)