質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

Q&A

解決済

1回答

2481閲覧

cakephp2.xでのwebrootから画像描画

Karna554

総合スコア10

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CakePHP

CakePHPは、PHPで書かれたWebアプリケーション開発用のフレームワークです。 Ruby on Railsの考え方を多く取り入れており、Railsの高速性とPHPの機動性を兼ね備えています。 MVCやORMなどを「規約優先の考え方」で利用するため、コードを書く手間を省くことができます。 外部のライブラリに依存しないので、単体での利用が可能です。

0グッド

0クリップ

投稿2020/05/14 14:46

前提・実現したいこと

現在cakephp2.xでWebアプリケーション作成の学習を行っています。

発生している問題・エラーメッセージ

cakephp2.xのチュートリアルを見ながら簡易ブログを作っていて、ユーザー情報ページに画像を表示する
プログラムを製作中です。
画像自体はWWW_ROOTを使って、webroot に登録できたのですがユーザー情報ページにて画像が表示できません。

画像のパスを確認してみたところ、
/user/cakePHP/cakePHP_Practice/cakephp/home/www/user/cakePHP/cakePHP_Practice/cakephp/app/webroot/upimg/8.jpg

のように画像のパスが重複している状態です。

該当のソースコード

UserController

1 public function edit($id = null) { 2 $date = date('ymd'); 3 $path = WWW_ROOT . 'upimg'; 4 5 $this->User->id = $id; 6 $this->set('user', $this->User->findById($id)); 7 if (!$this->User->exists()) { 8 throw new NotFoundException(__('Invalid user')); 9 } 10 if ($this->request->is('Post') || $this->request->is('put')) { 11 $img = $this->request->data('User.image.tmp_name'); 12 $name = $this->request->data('User.image.name'); 13 $ext = pathinfo($this->request->data['User']['image']['name'], PATHINFO_EXTENSION); 14 15 $uploadfile = $path . DS . $id . '.' . $ext; 16 17 if (!move_uploaded_file($img, $uploadfile)) { 18 $this->Flash->error(__('画像ファイルを保存できませんでした')); 19 return $this->redirect(array('controller' => 'posts', 'action' => 'index')); 20 } 21 //$this->request->data['User']['image'] = strstr($uploadfile, 'app'); 22 $this->request->data['User']['image'] = $uploadfile; 23 24 if ($this->User->save($this->request->data)) { 25 26 $this->Flash->success(__('ユーザー情報を更新しました')); 27 return $this->redirect(array('action' => 'view', $id)); 28 } 29 $this->Flash->error(__('The user could not be saved. Please try again.')); 30 } else { 31 $this->request->data = $this->User->findById($id); 32 unset($this->request->data['User']['password']); 33 } 34 }

User/view.ctp

1<h1>ユーザー名:<?php echo $user['User']['username']; ?></h1> 2<h1>メールアドレス:<?php echo h($user['User']['email']); ?></h1> 3<h4>ユーザー画像</h4> 4<?php 5if ($user['User']['image'] != NULL) {//DBにファイル名が保存されているかチェック 6 echo $this->Html->image($user['User']['image'], array('width'=>'200','height'=>'200')); 7 var_dump($user['User']['image']); 8} else { 9 echo '未登録'; 10} 11?> 12<p>【一言コメント】</p> 13<?php if (isset($user['User']['comment'])): ?> 14<p><?php echo h($user['User']['comment']); ?></p> 15<?php else: ?> 16<p>なし</p> 17<?php endif; ?> 18<?php 19if ($auth === $user['User']['id']) {//ログインユーザーと同じであれば編集が可能 20 echo $this->Html->link('ユーザー情報編集', array('controller' => 'users', 'action' => 'edit', $user['User']['id'])); 21} 22echo '<br>'; 23echo $this->Html->link('ホーム', array('controller' => 'posts', 'action' => 'index')); 24?> 25

補足情報(FW/ツールのバージョンなど)

cakePHP2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nojimage

2020/05/15 00:17

業務でCakePHP 2を扱うのでない限り、CakePHP 2の学習はお勧めしません。
guest

回答1

0

ベストアンサー

ファイルまでのフルパスを image に格納しているので、そのような結果になっています。

php

1$path = WWW_ROOT . 'upimg'; 2// (中略) 3$uploadfile = $path . DS . $id . '.' . $ext; 4// (中略) 5$this->request->data['User']['image'] = $uploadfile;

なので、WWW_ROOT = /var/www/html/webroot だとしたら、

User.image = /var/www/html/webroot/upimg/1.jpg

で保存されているはずです。

HtmlHelper::image() は渡されたにhttpがついていなければ、パスをwebrootからの相対パスとして解釈するので、

html

1<img src="/var/www/html/webroot/upimg/1.jpg">

がレンダリング結果となり、Webサーバーが参照するファイルは /var/www/html/webroot/var/www/html/webroot/upimg/1.jpg となります。

表示に使用するのであれば、User.imageにはwebrootからの相対パス、今回であれば '/upimg/1.jpg' を保存するとよいでしょう。
(表示しないファイルでも、データベースに保存するのは相対パスにしておくのが基本です。

投稿2020/05/15 00:04

nojimage

総合スコア959

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Karna554

2020/05/16 02:09

ありがとうございます こちらの情報のおかげで解決できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問