質問: ### CakePHPで画像ファイルをパスから表示させたい。 CakePHP初心者です。 現在、勉強しながらCakePHPでアプリ内での画像検索システムを作ろうとしています。 MySQLに画像のパスをMySQLに格納し、コントローラで取得してきてビューで表示させたいのですが、思っているようになりません。 ### 発生している問題・エラーメッセージ 上記のように実装をし、画像を表示するようにしました。 しかし、URLを /Project(APP名)/search(コントローラ名)/index/ のように直接打ち込むとしっかりと画像が表示されるのですが、フォームヘルパーより生成されるURLで飛ばすとURLがProject/search/となっているためか、パスはしっかりと取れているのですが画像は表示されません。 どのような対応をすれば画像をちゃんと表示することができるのでしょうか? ルーティングなど、いろいろ触ってみましたが解決しませんでした。よろしくお願いします。 /Project(APP名)/search(コントローラ名)/index/ としたとき ![表示される](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/a272c3e4dd881744e497579363d13af4.jpeg) Project/search/ としたとき ![表示されない](https://teratail-v2.storage.googleapis.com/uploads/contributed_images/605b207a02bddbccd2ed3117ac1d09d6.jpeg) ### 該当のソースコード ``` Model/SearchModel.php Controller/SearchsController.php Model名->find('条件')); $this->set('Search',$this->Search->find('all')); ?> View/Searchs/index.ctp 画像取得 "; ?> ``` ### 補足情報(言語/FW/ツール等のバージョンなど) PHPバージョン 5.5.34 CakePHPバージョン 2.6 MySQLバージョン 14.14
回答: MySQLに格納しているURLはどのように生成していますか? CakePHPではパスを表すのにコア定義定数を使うといいです。例えばwebrootのパスは「WWW_ROOT」で取得できます。 URLを直書きすると、POSTしたときにパラメータがスラッシュ区切りで付加されてしまうので、相対パスで直書きだとうまくファイルを参照できないことがあります。 例えば、app/webroot/data/test_data002_files/フォルダに画像を入れる場合は次のようにパスを作成します。 ``` // MySQLに格納する画像へのパス // Controllerなど WWW_ROOT.DS.'data'.DS.'test_data002_files'.DS.'1s_003.jpg' ``` 画像を表示するには次のように指定します。 ``` // View $this->Html->image('../data/test_data002_files/1s_003.jpg', array('alt' => 'CakePHP')); ``` 画像を表示する際にパスの指定に一つ上のディレクトリを参照しているのは、ヘルパーを使っているのでapp/webroot/img/フォルダが起点となっているためです。(app/webroot/data/以下のパスを参照する必要があります。)