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

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

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

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

CakePHP

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

Q&A

1回答

3030閲覧

CakePHP3でアップロードした画像の差し替えがうまくできない

jam912sh

総合スコア25

PHP

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

CakePHP

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

0グッド

0クリップ

投稿2019/08/06 06:19

編集2022/01/12 10:55

下記URLのサイトをもとに、画像アップロードの実装をおこなっております。
https://blog.s-giken.net/325.html

画像のアップロード、削除までは、実装できましたが、
編集を行う際、画像の差し替えを行った場合に、新たにアップロードした画像が
DBに反映されません。同様に、指定したディレクトリにも画像が格納されません。
編集を実行してもエラーメッセージなどは表示されず、保存されたというメッセージが出力されます。

丸3日ほど、色々と修正を試みましたが、解消はされませんでした。
CakePHPにお詳しい方のお力をお借りしたく存じます。
宜しくお願い致します。

DBデーブル

CREATE TABLE `news` ( `id` int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY, `title_date` date NOT NULL, `title` varchar(255) NOT NULL, `body` text, `file_name` text, `created` datetime NOT NULL, `modified` datetime NOT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;

edit.ctp

<?php $this->assign('title','Edit Post'); ?> <h1>編集画面</h1> <?= $this->Html->link('戻る',['action'=>'index'],['class'=>['pull-right','fs12']]); ?> <?= $this->Form->create($news); ?> <?= $this->Form->textarea('title_date'); ?> <?= $this->Form->textarea('title'); ?> <?= $this->Form->textarea('body'); ?> <!--画像の修正--> <?php //image」の有無をチェックすることで、ファイルがアップロードされているか否かをチェック if($news->file_name){ echo $this->Html->image("/upload_img/".str_replace('\','/',$news->file_name)); echo $this->Form->input("file_before",["type"=>"hidden", "value"=>$news->file_name]); echo $this->Form->input("delete",["type"=>"submit", "name"=>"file_delete", "value"=>"delete"]); }?> <?=$this->Form->control('file_name1',["type"=>"file"]);?> <?= $this->Form->button('submit'); ?> <?= $this->Form->end(); ?>

NewsController.php

<?php namespace App\Controller; use App\Controller\AppController; use Cake\Filesystem\Folder; use Cake\Filesystem\File; use RuntimeException; class NewsController extends AppController { public function index() { $news = $this->paginate($this->News); $this->set(compact('news')); } ////編集////////////////////////////////////////////////////////////////////// public function edit($id = null) { //変数newsの中に、DBから取得したデータを入れる $news = $this->News->get($id, [ 'contain' => [] ]); //PATCH 一部分を更新したい場合。POST 新規に追加する場合。 PUT 丸ごと更新する場合。 //リクエストがPATCH、POST、PUT である時の処理 if ($this->request->is(['patch', 'post', 'put'])) { //patchEntityこれは、データの更新するときに使用する。具体的には、更新処理。 //patchEntity 複数のレコードのデータを一括して更新してくれる //テーブルnewsのデータを取得 $news = $this->News->patchEntity($news, $this->request->getData()); //アップロードするファイルを保存するフォルダを指定 $dir = realpath(WWW_ROOT . "/upload_img"); // deleteボタンがクリックされたか、いかなの判定 if($this->request->getData('file_delete')){ try { //フォルダを作成して、そこに差し替えまえのファイルを移動させる $del_file = new File($dir . "/". $this->request->getData('file_before')); // ファイル削除処理実行 Fileクラスで削除処理対象のファイルを指定して削除を実行 if($del_file->delete()) { $news['file_name'] = ""; } else { //削除できなかった時の処理 $news['file_name'] = $this->request->getData('file_before'); throw new RuntimeException('ファイルの削除ができませんでした.'); } //エラー処理 } catch (RuntimeException $e){ $this->Flash->error(__($e->getMessage())); } } else { //submitボタンを押した時の処理。 // ファイルが入力されたとき、ファイルをアップロードする if ($this->request->getData('file_name.name')) { $limitFileSize = 10240 * 10240; //アップロードするファイルを保存するフォルダを指定 $dir = realpath(WWW_ROOT . "/upload_img"); try { //ファイルの入力項目の値「$this->request->data['file_name']」と指定した値を引数として渡して、関数を実行 $news['file_name'] = $this->file_upload($this->request->getData('file_name1'), $dir, $limitFileSize); } catch (RuntimeException $e){ $this->Flash->error(__('ファイルのアップロードができませんでした.')); $this->Flash->error(__($e->getMessage())); } catch (RuntimeException $e){ // アップロード失敗の時、既登録ファイルがある場合はそれを保持 if ($this->request->getData('file_before')){ $news['file_name'] = $this->request->getData('file_before'); } $this->Flash->error(__('ファイルのアップロードができませんでした.')); $this->Flash->error(__($e->getMessage())); } } else { // ファイルは入力されていないけど登録されているファイルがあるとき if ($this->request->getData('file_before')){ $news['file_name'] = $this->request->getData('file_before'); } } } if ($this->News->save($news)) { $this->Flash->success(__('The news has been saved.')); if($this->request-> getData('file_delete')){ $this->set(compact('news')); return $this->redirect(['action' => 'edit', $id]); } else { return $this->redirect(['action' => 'index']); } } $this->Flash->error(__('The news could not be saved. Please, try again.')); } $this->set(compact('news')); $this->set('_serialize', ['news']); } ///////////////////////////////////////////////////////////////////////////// ////実際にファイルアップロードを行う処理/////////////////////////////////// public function file_upload ($file = null,$dir = null, $limitFileSize = 10240 * 10240){ try { // ファイルを保存するフォルダ $dirの値のチェック if ($dir){ if(!file_exists($dir)){ throw new RuntimeException('指定のディレクトリがありません。'); } } else { throw new RuntimeException('ディレクトリの指定がありません。'); } // 未定義、複数ファイル、破損攻撃のいずれかの場合は無効処理 if (!isset($file['error']) || is_array($file['error'])){ throw new RuntimeException('Invalid parameters.'); } // エラーのチェック switch ($file['error']) { case 0: break; case UPLOAD_ERR_OK: break; case UPLOAD_ERR_NO_FILE: throw new RuntimeException('No file sent.'); case UPLOAD_ERR_INI_SIZE: case UPLOAD_ERR_FORM_SIZE: throw new RuntimeException('Exceeded filesize limit.'); default: throw new RuntimeException('Unknown errors.'); } // ファイル情報取得 $fileInfo = new File($file["tmp_name"]); // ファイルサイズのチェック if ($fileInfo->size() > $limitFileSize) { throw new RuntimeException('Exceeded filesize limit.'); } // ファイルタイプのチェックし、拡張子を取得 if (false === $ext = array_search($fileInfo->mime(), ['jpg' => 'image/jpeg', 'png' => 'image/png', 'gif' => 'image/gif',], true)){ throw new RuntimeException('Invalid file format.'); } // ファイル名の生成 //そのままのファイル名を使用 $uploadFile = $file["name"] . "." . $ext; $uploadFile = sha1_file($file["tmp_name"]) . "." . $ext; // ファイルの移動 if (!@move_uploaded_file($file["tmp_name"], $dir . "/" . $uploadFile)){ throw new RuntimeException('アップロードしたファイルの移動ができませんでした'); } // 処理を抜けたら正常終了 // echo 'File is uploaded successfully.'; } catch (RuntimeException $e) { throw $e; } return $uploadFile; } ///////////////////////////////////////////////////////////////////////////// }

NewsTabele.php

<?php namespace App\Model\Table; //クラスをまえもって呼び出しておく use Cake\ORM\Table; //画像拡張子を指定するためのバリデーションを使えるようにする use Cake\Validation\Validator; $validator = new Validator(); class NewsTable extends Table { //初期化しておく public function initialize(array $config) { $this->setTable('news'); $this->primaryKey('id'); $this->setDisplayField('dir'); //$this->addBehavior('Timestamp'); } }

情報

phpバージョン:7.2.19 cakePHPバージョン:3.7.8 画像格納先:webroot/upload_img/

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

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

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

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

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

m.ts10806

2019/08/06 06:28

コードあまり見てませんが、編集時、ファイル以外のカラムは正しく更新されているのでしょうか。またアップロードするファイルは、別の名前をつけてもできてませんか? アップロード処理は正しく通っているのでしょうか
jam912sh

2019/08/06 06:33 編集

mts10806様 ご返答有難うございます。 >編集時、ファイル以外のカラムは正しく更新されている ファイル以外のカラムは正しく更新可能でございます。 >アップロードするファイルは、別の名前をつけてもできてませんか はい、アップロードできない状態でございます。 >アップロード処理は正しく通っているのでしょうか はい、アップロード処理は問題ないかと存じます。画像の差し替え動作に問題があるかと存じます。 宜しくお願い致します。
m.ts10806

2019/08/06 06:49

もう1点確認です。 「フォルダを作成して、そこに差し替えまえのファイルを移動させる」 はできているということでよろしいですか?
jam912sh

2019/08/06 06:56

mts10806様 ご確認頂き有難うございます。 >フォルダを作成して、そこに差し替えまえのファイルを移動させる こちらの処理、うまく出来ていないようでございます。 削除処理は問題なくできているようでございます。 宜しくお願い致します。
guest

回答1

0

formが

<?=$this->Form->control('file_name1',["type"=>"file"]);?>

で定義されているなら下記は

if ($this->request->getData('file_name.name')) {
ではなく
if ($this->request->getData('file_name1')) {
では?

投稿2019/08/06 07:20

m.ts10806

総合スコア80765

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

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

jam912sh

2019/08/06 07:34

mts10806様 ご確認頂き有難うございます。 ご教示いただきました修正を行い動作確認致しましたところ、 画像の差し替えを実行後、「ファイルのアップロードができませんでした.」と「Invalid parameters.」のエラーが表示され、画像の差し替え処理が出来ないようでございます。 (DBの「file_name」は反映されず、指定ディレクトリーに画像は格納されないようでございます。) お忙しい中、ご確認頂き有難う御座います!
m.ts10806

2019/08/06 07:40

試行錯誤の連続で解決していくものなので、あくまで回答は一歩目に過ぎません。 ところで、対応前は「ファイルのアップロードができませんでした」と出ていたのでしょうか?
jam912sh

2019/08/06 07:51

上記の件、承知致しました。勉強になります。 >「ファイルのアップロードができませんでした」と出ていたのでしょうか? はい、フラッシュエラーコメントにて、そのように表示されました。
jam912sh

2019/08/06 07:55

先程、ご指摘いただきました箇所を以下のように変更致しましたところ、 DBの「file_name」へは、データの更新ができたようで御座います! しかしながら、指定ディレクトリには、ファイルが格納されませんでした。 あと、一歩というところで御座いますでしょうか。 <?=$this->Form->control('file_name1',["type"=>"file"]);?> ↓ <?=$this->Form->control('file_name',["type"=>"file"]);?>
m.ts10806

2019/08/06 07:55

それは「file_name.name」のときの話ということで良いですね? では次です。 「ファイルのアップロードができませんでした」と出るということは、 いずれの書き方でも「// ファイルが入力されたとき、ファイルをアップロードする」が通っていたということになります。(個人的にはかなり不思議です。) 「ファイルのアップロードができませんでした」と出るということは 同時に「$e->getMessage()」も拾っているということになります。 ここはなんと出ていたのでしょうか?
m.ts10806

2019/08/06 07:56

> <?=$this->Form->control('file_name',["type"=>"file"]);?> それは・・・ アップロード処理では[file_name1]と書いてますからね。
jam912sh

2019/08/06 08:07

>同時に「$e->getMessage()」も拾っているということになります。 >ここはなんと出ていたのでしょうか? フラッシュメッセージが確かに3つ表示されておりました。 3つ目は、 The news has been saved. と表示されております。
m.ts10806

2019/08/06 08:13

そこのことではないかなと。 そもそも「ファイルのアップロードができませんでした.」が何個目とか私の方では把握していないので、 全部並べてもらったほうが良いです。 (それにThe news has been saved.単に「保存された」の報告だけでは)
m.ts10806

2019/08/06 08:13

というかファイルアップロードできてないならsaveさせてはダメだと思います。 失敗した時点でエラーとして返さないと
jam912sh

2019/08/06 08:28

ごもっともで御座いますね。 ご指摘箇所、修正し、今一度動作確認致します。 ちなみに、全部フラッシュエラーを並べますと以下で御座います。 1つ目「ファイルのアップロードができませんでした.」 2つ目「Invalid parameters.」 3つ目「The news has been saved.」 今日はこれから、席を外しまして、、進捗が悪いので、大目玉を喰らいに行ってまいります。 また明日調査致します! お忙しい中、ご教示頂きまして、有難うございました。大変参考になりました。
m.ts10806

2019/08/06 08:39

> Invalid parameters. 直接原因はこれですね。 ちゃんとfile_upload()内でそのメッセージ返してるようですし、 その変をデバッグしてみてください。たぶんあとはデバッグで解決できます。 ちなみに3つ目は先ほども言いましたがエラーではないですね。 コードを読むと分かりますが「$this->Flash->success()」でセットされていますし。 (自分で質問しているのに他人のコードのような話し方されてますが、どこまでこのコードを把握できているのでしょうか。かなり不安です。)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問