【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を使った方がよいと思います。