CakePHPのPluginであるUpload_Packの困った動作

バグではないのでしょうが、ちょっと困った動作をしました。

例えば「1-1.jpg」や「2 2.jpg」といったファイル名のファイルをアップロードした場合、データベースのファイル名フィールドにはそのまま「1-1.jpg」「2 2.jpg」と記録されます。

ところが、Upload_Packがテンポラリフォルダから$actsAsで指定したPathに移動する際、リネームしてしまい「1_1.jpg」や「2_2.jpg」になります。
ハイフン、スペース、ドットなどの特殊文字がエスケープされ、アンダーバーに変換されてしまうのです。

これはURLにふさわしいファイル名にするようCakePHP内のInflector::slugをファイル名に対して実行しているからです。

本来であれば特殊文字などURLにふさわしくない文字をエスケープしてくれる関数なのですが、データベース内のファイル名とリネーム後のファイル名が変わってしまうため、表示させようとしてデータベースからファイル名をひっぱってきても、ファイルが存在しないという自体に陥ってしまいます。

解決法その1 – Upload_Pack内のInflector::slugを無効にする

ただし、ファイル名内の特殊文字は残ってしまうため、最善の方法とは言えません。

解決法その2 – saveAll前にリクエストデータを書き換える

データベースの記録&upload_packによるリネームの前にファイル名をエスケープさせる作戦です。

こちらの方法がオススメです。

関連記事

コメントを残す

メールアドレスが公開されることはありません。

Trackback URL

管理者の承認後に表示します。