2011年2月9日水曜日

【CakePHP】ファイルアップロード関連のプラグインに頼ってはいけない

とあるシステムで、画像をアップロードし管理するという、非常によくある機能の実装に関わった。半日程度で手早く終わらせてしまいたかった事もあり、まずは既存のプラグインで済ませられないかを調査した。
環境はCakePHP1.3。システム自体は半分出来上がっていることもあり、DBなどに加える手は最小限にしたいというのが、私だけでなく顧客からの要望である。

まず真っ先に辿り着いたのが、Media Plugin。日本語でのブログ記事などが多少あることもあり、取っ付き易い分後で人に任せられるかなと淡い期待を寄せてみた。しかし、

  • CakePHP1.3に対応したバージョンは別のライブラリを使っているため非常に分かりにくく、公式のドキュメントも雑。というか説明書もない状態。
  • 最新の安定版と謳っているバージョンを試してみたところ、バージョニング処理で問題がある模様。
  • そもそもアップロードされたファイルにリネームもかけずそのままサーバ側に保存している時点で、日本での使用はそのままでは無理。
  • ↑のリネームの問題については、趣味の延長線にあるtipsを参考にし、対処が可能だった。ただしCakePHP1.2に対応している旧バージョンでのお話なので、試すにもプラグインのバージョンを落とさなければならなかった。
  • 旧バージョンのプラグインも、少し手を加えればCakePHP1.3でも動いた。
  • リネームをCakePHP1.3対応のバージョンでやろうとすると非常にめんどくさい。というか途中で投げた。

導入にやや手間取ったため、『他のプラグインならもっと楽出来るんじゃないか?』という考えが頭をよぎる。そこで他のも幾つか試すことに。しかし、結果的にマトモに実用に耐えうるプラグインはMedia Pluginが最初で最後となる。

次に導入を試みたのがUploadpack
  • 付属のread meは多少だがボリュームがあり、トラブルシューティングが出来なくもない。ただし日本語の関連ドキュメントは皆無なので、誰かに投げるという選択肢が無くなってしまうことが一番問題に思えた。
  • 機能など鑑みると前述のMedia Pluginがまさに上位互換となっており、じゃあとりあえず動いたMedia Pluginでいいじゃん?と気づく。
更にその次に、MeioUploadも試してみた。
  • 絶望的にドキュメントが不親切。それこそ『俺のソース読んでくれないか?』と言わんばかりに。
  • そんなこんなで導入もめんどくさかった。前述Uploadpackと同じく、機能もそこそこなので無理して導入する必要もない。
そしてこの辺りでやっと気がつく。導入に手間取るめんどくさいプラグインや、片手落ちのプラグインを導入して結果自前のコードで補完するくらいなら、最初から自分で書いたほうがずっとマシ、ということに。

実はCakePHPのファイルアップロード関連の仕組みは、単純ながら必要な機能は網羅されているため、ファイルのmineタイプの検証やファイル名のリネームなど、やりたい事は全部自前のコードでやってしまったほうが早い。
例えばファイルをアップロードしたい場合、

<?= $form->create("Hoge", array("type"=>"file", "url"=>array("controller"=>"foo", "action"=>"bar", ), )) ?>

<?= $form->input("file", array("type"=>"file", "label"=>false, )) ?>

<input type="submit" value="送信" />

<?= $form->end() ?>



といった具合のフォームでコントローラにリクエストを投げれば、後は勝手に送信したファイルの情報をまとめてくれ、コントローラ側では

print_r($this->data["Hoge"]["file"]);

Array

(

    [name] => test.gif

    [type] => image/gif

    [tmp_name] => /private/var/tmp/phpiU5KRx

    [error] => 0

    [size] => 2164

)


こんな具合に最低限必要になる情報が連想配列にまとまっている。

必要最低限とは言うものの、必要十分な情報だ。他に必要な情報があれば標準の関数で拾ってこれる。
今後同様の機能を実装する際は、プラグインに頼ってはいけないということを忘れないようにしたい。

0 件のコメント:

コメントを投稿