【CakePHP】MediaPluginをWindows(XAMPP等)で使う場合の注意点

cake-logoMediaPluginでファイルアップロードを行う場合、XAMPP等のWindows環境ではうまく保存されないことが分かりました。
Windowsで保存を試みますと、mkdir()でエラーが出る他、「webroot/media/filter/(version name)/transfer/img/(file name)」でファイルが保存できません。

原因は非常に単純で、上記パスが、「transfer/img」以外の場所のDSはOSにしたがったもの(つまりWindowsは「¥」)であるのに対し、該当箇所が「/」になっていているために正しく格納ができなくてエラーが出るようです。これを修正するためには、「plugin/media/models/behavior/media.php」の161行付近を次のように修正します。

■修正前のコード


$dirname = substr(str_replace(
str_replace('\\', '/', $baseDirectory),
null,
str_replace('\\', '/', Folder::slashTerm($File->Folder->pwd()))
), 0, -1);


■修正後のコード


$dirname = substr(str_replace(
str_replace('\\', DS, $baseDirectory),
null,
str_replace('\\', DS, Folder::slashTerm($File->Folder->pwd()))
), 0, -1);

ちなみに現在開発が進んでいると思われる1.3版はここの仕組みが若干違いますが、似たような対策は必要かと思います。

なお、この修正方法が正しいかどうかは分かりません。というのは、結局のところ「¥だった場合に¥に」リプレースしているため、意味がないように思うからです。おそらく「/」と「¥」が混在した場合に統一するための仕組みのようにも思えますが、もう少し改良が必要だった、というわけですね。

同様の理由で、一般的にパスやディレクトリを指定する場合に「¥」と「/」が混在しているとうまく動きませんので気をつけましょう。極力DSを使った方がよいと思います。

【CakePHP】「Media Plugin」の概要と構成

cake-logo先の記事で「Media Plugin for CakePHP」のセッションスライドを紹介させていただいたのですが、実際にソースを調べたりして分かったことをまとめてみることにしました。

まずは序章ということで、概要とプラグインの構成を紹介させていただきます。
そして、実際に利用する手順などを後の記事で紹介させていただく予定です。

概要

「Media Plugin for CakePHP」は、画像や動画などのいわゆる「メディアファイル」を始めとした、ファイルアップロード及びそれらの管理を簡単かつ安全にに行うためのプログラム群です。プラグイン形式で提供されているため、プログラム管理がしやすく、またこれらを部品として利用することが出来るため、カスタマイズ性に優れています。

構成

Media Pluginは、大きく分けて次のパートから構成されています。

■Transfer Behavior
ファイルを「外部から持ってくる」ためのビヘイビアで、「ファイルバリデーション」と指定ディレクトリへの「ファイル転送」を担当します。
「ファイルバリデーション」は、一般的な「容量」「ファイル形式」といったチェックだけでなく、不正ファイルを検査するための強力なチェック機能を提供します。MIME Typeと拡張子、ファイル内容を相互的にチェックすることで、そのファイルが信頼性あるものかを調べます。また、画像サイズや送信元の場所(ディレクトリやURL)、パーミッションなども調べます。
「ファイル転送」は、実際にファイルを読み込んで指定ディレクトリへ保存します。転送はには、PHPのアップロード関数ではなく、Cake標準のソケット機能を使用しているようです。

■Media Behavior
Transfer Behaviorはファイルそのものを「持ってくる」動作を担当していますが、Media Behaviorではそれ以降の「持ってきたファイルの取り扱い」を担当します。
中でも興味深いのは「バージョン」という概念です。一つのアップロードファイルからいろいろな加工を行い、それを一元管理する機能を有しています。例えば、画像ファイルを1つアップロードしただけで大中小の画像を作り、それを実際のサイトで扱うことが出来ます。画像だけでなく、他のファイルでも面白い機能を持っています。例えば、JavaScriptやCSSでは、ソースの中身を圧縮して難読化することも出来たり、ビデオ映像からサムネイル画像を作りだすことも出来るようです(未確認)。

■Polymorphic Behavior(2009/07/18追記)
このビヘイビアは、メディア関連に限らず、いろいろなモデルに適用できる大変に便利なものです。
取り付けたモデルのフィールドに、関連づけたいモデルとそのIDを用意すると、自動でその記述モデルのアソシエーションを設定し、データを引っ張ってきて検索結果に取り付けます。
唯一残念な点は、このビヘイビアは「belongsTo」として他のモデルを取ってくる点です。つまり、1つのデータしか関連づけできません。このビヘイビアは、拡張してhasManyでも適用できるようにすると、更に便利なビヘイビアになりそうです。
一応、このビヘイビアを使う問題点もあります。データレベルで付け替えが出来てしまうため、セキュリティ的に不安な点があります(ぶっちゃけ、Userモデルを引っ張ってくる悪用が出来てしまう)。柔軟に対処するために、このビヘイビアで入手したデータを丸ごと表示するような利用は危険ですが、データを限定して利用するような方法なら便利に活用できることでしょう。

[200/907/19追記]
このビヘイビアが「belongsTo」である理由は、純粋に「Attachmentモデル(もしくはそれに相当するモデル)から動的に親モデルをたどるため」に作ったようで、まあつまり汎用的な設計ではないのでしょう。

■Attachment Model
上記3つのビヘイビアの導入をテンプレート化したモデルです。
特にこだわりが無いのであれば、このモデルを利用すれば簡単にファイル管理が行えます。
もしくは、このモデルを加工して自分のモデルを作成するのも良いかもしれません。

■Medium Helper
管理しているファイルを実際にサイト上で表示したりリンクを生成したりするヘルパーです。
例えばフラッシュやムービー、オーディオ、PDF等の埋め込みHTMLの生成を行ったり、リンクをつけたりすることが出来ます。
また、「バージョン」管理をしている場合でも適切な画像を呼び出します。

■Medium
メディアファイル管理の実体要素、オブジェクトクラスです。実際には、各ファイルタイプ別にオブジェクトクラスがあります。

■Adapter
各ファイルの固有の操作を統一化して扱うためのカプセルで、datasourceのような働きをします。例えばgdを用いて物理的に画像情報を入手したり、画像のフィッティングを行ったりするのはアダプター(gdアダプター)で行います。

■その他
その他、ファイルの格納場所を生成・管理するするコンソールがあります。